Como obter a largura e a altura da tela no iOS?

Como se pode obter as dimensões da tela no iOS?

Actualmente, eu uso:

lCurrentWidth = self.view.frame.size.width;
lCurrentHeight = self.view.frame.size.height;

em viewWillAppear: e willAnimateRotationToInterfaceOrientation:duration:

A primeira vez que tenho o tamanho do ecrã inteiro. Da segunda vez, tenho o ecrã menos a barra de navegação.

Solução

Como se pode obter as dimensões da tela no iOS?

O problema com o código que você postou é que você'está contando com o tamanho da vista para combinar com o da tela, e como você'já viu isso'nem sempre é o caso. Se você precisa do tamanho da tela, você deve olhar para o objeto que representa a tela em si, desta forma:

CGRect screenRect = [[UIScreen mainScreen] bounds];
CGFloat screenWidth = screenRect.size.width;
CGFloat screenHeight = screenRect.size.height;

Atualização para vista dividida: Nos comentários, o Dmitry perguntou:

Como posso ter o tamanho do ecrã na vista dividida?

O código dado acima reporta o tamanho da tela, mesmo em modo de tela dividida. Quando você usa o modo de tela dividida, a janela do seu app's muda. Se o código acima não'não lhe dá a informação que você espera, então como o OP, você'está olhando para o objeto errado. Neste caso, porém, você deve olhar para a janela ao invés de olhar para a tela, assim:

CGRect windowRect = self.view.window.frame;
CGFloat windowWidth = windowRect.size.width;
CGFloat windowHeight = windowRect.size.height;

Swift 4.2

let screenRect = UIScreen.main.bounds
let screenWidth = screenRect.size.width
let screenHeight = screenRect.size.height

// split screen            
let windowRect = self.view.window?.frame
let windowWidth = windowRect?.size.width
let windowHeight = windowRect?.size.height
Comentários (16)

Cuidado, [UIScreen mainScreen] também contém a barra de status, se você quiser recuperar o quadro para sua aplicação (excluindo a barra de status) você deve usar

+ (CGFloat) window_height   {
    return [UIScreen mainScreen].applicationFrame.size.height;
}

+ (CGFloat) window_width   {
    return [UIScreen mainScreen].applicationFrame.size.width;
}
Comentários (2)

Eu já usei estes métodos de conveniência antes:

- (CGRect)getScreenFrameForCurrentOrientation {
    return [self getScreenFrameForOrientation:[UIApplication sharedApplication].statusBarOrientation];
}

- (CGRect)getScreenFrameForOrientation:(UIInterfaceOrientation)orientation {

    CGRect fullScreenRect = [[UIScreen mainScreen] bounds];

    // implicitly in Portrait orientation.
    if (UIInterfaceOrientationIsLandscape(orientation)) {
      CGRect temp = CGRectZero;
      temp.size.width = fullScreenRect.size.height;
      temp.size.height = fullScreenRect.size.width;
      fullScreenRect = temp;
    }

    if (![[UIApplication sharedApplication] statusBarHidden]) {
      CGFloat statusBarHeight = 20; // Needs a better solution, FYI statusBarFrame reports wrong in some cases..
      fullScreenRect.size.height -= statusBarHeight;
    }

    return fullScreenRect;
} 
Comentários (8)