es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

SKView frame incorrecto en simulador de iPhone.

Mi objetivo es construir y ejecutar el Proyecto de Plantilla Xcode SpriteKit en un iPhone 12 Pro Max. Utilizaré Xcode Versión 12.5 (12E262). He creado muchos proyectos en el pasado, pero recientemente, cuando la aplicación se inicia, el marco de la vista es incorrecto.

Te mostraré lo que quiero decir a través de un ejemplo repetible.
Sigue estos pasos muy cuidadosamente:
1. Abre tu aplicación Xcode.
2. En el menú selecciona: Archivo > Nuevo > Proyecto…
3. Selecciona la plantilla: iOS, Juego.
4. Haz clic en “Siguiente”.
5. Nombra tu producto “Foo” u otro nombre simple.
6. Haz clic en “Siguiente”.
7. Haz clic en “Crear”.
8. En el menú selecciona: Producto > Destino > iPhone 12 Pro Max.
9. En el menú selecciona: Producto > Ejecutar.
10. Ahora, espera a que se inicie el simulador y ¡voilà!
11. En el menú selecciona: Ver > Entrar en pantalla completa.

Si has seguido los pasos cuidadosamente, esto es lo que deberías obtener

Para aquellos que no pueden ver la imagen:
He tomado una captura de pantalla del iPhone simulado después de que se haya iniciado. Dado que estamos ejecutando el proyecto de plantilla SpriteKit, el simulador muestra un fondo gris con el texto “Hola mundo” en el centro, como de costumbre. Al examinarlo más detenidamente, las dimensiones del fondo gris no parecen ajustarse de la manera más óptima al iPhone. De hecho, la proporción del fondo gris es (1.5:1), mientras que la proporción del iPhone 12 Pro Max es aproximadamente (2.16:1), una gran diferencia. Esto resulta en grandes rectángulos negros encima y debajo de la vista. ¡Vaya, eso es molesto!

Dentro del archivo GameViewController.swift, dentro del método viewDidLoad() en la línea 22, agregué:

print(view.frame.size, scene.size) // imprime (320.0, 480.0) (750.0, 1334.0)

Observé lo siguiente:
view.frame.size tiene una proporción incorrecta: 480 : 320 = (1.5:1)
scene.size tiene una proporción más correcta de: 1334 : 750 ~ (1.78:1)

Parece que he descubierto al culpable, pero no tengo idea de cómo solucionarlo.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como experto en tecnología de la información especializado en Swift, SpriteKit y SKView, hay algunas soluciones posibles a este problema.

    Una posible solución es modificar el archivo GameViewController.swift para asegurarse de que la vista tenga la relación de aspecto correcta para el dispositivo. Aquí están los pasos para actualizar el archivo:

    1. En el archivo GameViewController.swift, encuentra el método viewDidLoad().
    2. Agrega el siguiente código al final del método:
    if let skView = self.view as? SKView {
        skView.ignoresSiblingOrder = true
        skView.showsFPS = true
        skView.showsNodeCount = true
    
        // Relación de aspecto fija
        skView.contentMode = .scaleAspectFill
    }
    
    1. Vuelve a ejecutar el proyecto en el simulador del iPhone 12 Pro Max.

    Este código debería solucionar el problema de la relación de aspecto al establecer el modo de contenido en scaleAspectFill, lo que asegurará que la vista llene la pantalla manteniendo la relación de aspecto correcta para el dispositivo.

    Si esta solución no funciona, otra posible solución es ajustar manualmente el tamaño y la posición de la vista en el código según el tamaño de pantalla del dispositivo. Esto se puede hacer modificando el método viewDidLoad() en el archivo GameViewController.swift de la siguiente manera:

    override func viewDidLoad() {
        super.viewDidLoad()
    
        if let view = self.view as? SKView {
            view.ignoresSiblingOrder = true
            view.showsFPS = true
            view.showsNodeCount = true
    
            // Calcula el nuevo tamaño y posición de la vista según el tamaño de pantalla del dispositivo
            let screenSize = UIScreen.main.bounds.size
            let aspectRatio = CGSize(width: 750.0, height: 1334.0)
            let scale = max(screenSize.width / aspectRatio.width, screenSize.height / aspectRatio.height)
            let size = CGSize(width: aspectRatio.width * scale, height: aspectRatio.height * scale)
            let x = (screenSize.width - size.width) / 2.0
            let y = (screenSize.height - size.height) / 2.0
    
            view.frame = CGRect(x: x, y: y, width: size.width, height: size.height)
        }
    }
    

    Este código calcula el tamaño y la posición correctos de la vista según el tamaño de pantalla del dispositivo y establece el marco correspondiente.

    Esperemos que una de estas soluciones solucione el problema incorrecto del marco de la vista y permita que el proyecto de plantilla de SpriteKit se ejecute correctamente en el iPhone 12 Pro Max.

Comments are closed.