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.
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;
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
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;
}
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;
}