Executei o seguinte código no iOS 7 e iOS 8:
UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
BOOL landscape = (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight);
NSLog(@"Currently landscape: %@, width: %.2f, height: %.2f",
(landscape ? @"Yes" : @"No"),
[[UIScreen mainScreen] bounds].size.width,
[[UIScreen mainScreen] bounds].size.height);
A seguir, o resultado do iOS 8:
Currently landscape: No, width: 320.00, height: 568.00
Currently landscape: Yes, width: 568.00, height: 320.00
Comparando com o resultado no iOS 7:
Currently landscape: No, width: 320.00, height: 568.00
Currently landscape: Yes, width: 320.00, height: 568.00
Existe alguma documentação especificando essa alteração? Ou é um bug temporário nas APIs do iOS 8?
Respostas:
Sim, é dependente da orientação no iOS8, não um bug. Você pode revisar a sessão 214 da WWDC 2014 para obter mais informações: "Exibir avanços do controlador no iOS 8"
Citação da apresentação:
O UIScreen agora é orientado por interface:
fonte
Sim, depende da orientação no iOS8.
Eu escrevi um método Util para resolver esse problema para aplicativos que precisam suportar versões mais antigas do sistema operacional.
fonte
Sim, na verdade, o tamanho da tela agora depende da orientação no iOS 8. Às vezes, porém, é desejável obter um tamanho fixo para a orientação retrato. Aqui está como eu faço isso.
fonte
Sim, agora depende da orientação.
Prefiro o método abaixo para obter o tamanho da tela de maneira independente da orientação do que algumas das respostas acima, tanto porque é mais simples quanto porque não depende de nenhum código de orientação (cujo estado pode depender do quando são chamados) ou na verificação de versão. Você pode querer o novo comportamento do iOS 8, mas isso funcionará se você precisar ser estável em todas as versões do iOS.
fonte
Relacionado a esta pergunta, pois resolveu meu problema, aqui duas definem que eu uso para cálculos de largura e altura da tela:
Se você suporta o iOS 7 e o iOS 8, esta é a melhor solução para esse problema.
fonte
Você pode usar
nativeBounds
(independente da orientação)nativeBounds
Detectando a altura do dispositivo:
Detectando a largura do dispositivo:
fonte
Não é um bug no iOS 8 SDK. Eles estabeleceram limites na orientação da interface. De acordo com sua pergunta sobre alguma referência ou documentação para esse fato, eu recomendo que você assista à
View Controller Advancements in iOS 8
214 sessão da WWDC 2014 . A parte mais interessante (de acordo com suas dúvidas) é aScreen Coordinates
que começa às 50:45.fonte
Sim, depende da orientação no iOS8.
Veja como você pode ter uma maneira consistente de ler os limites do iOS 8 nas versões do SDK e do SO.
fonte
Minha solução é uma combinação de MaxK e hfossli. Eu fiz esse método em uma categoria do UIScreen e ele não possui verificações de versão (o que é uma prática ruim):
fonte
Eu precisava de uma função de ajuda rápida que mantivesse o mesmo comportamento do iOS7 no iOS8 - isso me permitia trocar minhas
[[UIScreen mainScreen] bounds]
chamadas e não tocar em outro código ...fonte
O método abaixo pode ser usado para encontrar os limites da tela para uma determinada orientação, independentemente da versão do iOS. Este método retornará os limites com base no tamanho da tela do dispositivo e fornecerá o mesmo valor de CGRect independente da versão do iOS.
fonte
Isso é o que eu usei para calcular o correto correto:
fonte
Apenas adicionando a versão rápida de uma excelente função cbartel, respondida acima.
fonte
Meu problema estava relacionado ao quadro UIWindows, que estava diminuindo. Por isso, criei o código abaixo no MyViewController - (NSUInteger) Método supportedInterfaceOrientations
E seu trabalho para mim, tente.
fonte
iOS 8 ou superior
Uma solução para quem deseja descobrir o tamanho da tela em pontos (a tela de 3,5 polegadas possui 320 × 480 pontos, a tela de 4,0 polegadas possui 320 × 568 pontos etc.) seria
fonte
Uma coisa que observei é que a ordem das orientações de interface suportadas no Info.plist é importante. Eu obtive o problema desta pergunta com meu aplicativo (que faz orientação no código), mas não especifiquei em nenhum lugar que a orientação padrão seja Portrait.
Eu pensei que a orientação padrão era Retrato em qualquer caso.
Reorganizar itens no Info.plist, colocando o Portrait em primeiro lugar, restaurou o comportamento esperado.
fonte
Isso fornecerá o dispositivo correto no iOS7 e iOS8 ,
// Você também pode adicionar mais dispositivos (ieiPad).
fonte
Usou a solução de mnemia levemente modificada, aquela sem verificação de versão do iOS, usando min / max nos limites da tela principal.
Eu precisava de um
CGRect
, então temosCGRect
de limites MainScreen e mudousize.width=min(w,h)
,size.height=max(w,h)
. Em seguida, chamei aCGRect
função get independente do sistema operacional em dois lugares no meu código, onde obtive o tamanho da telaOpenGL
, toques etc. Antes de corrigir, eu tinha dois problemas - no IOS 8.x no modo paisagem, a posição deOpenGL
exibição do modo paisagem estava incorreta: 1 / 4 de tela cheia na parte inferior esquerda. E os segundos toques retornaram valores inválidos. Ambos os problemas foram corrigidos conforme explicado. Obrigado!fonte