Acabei de atualizar para o XCode 4.5 GM e descobri que agora você pode aplicar o tamanho '4 "Retina' ao seu controlador de exibição no storyboard.
Agora, se eu quiser criar um aplicativo que seja executado no iPhone 4 e 5, é claro que preciso construir todas as janelas duas vezes, mas também preciso detectar se o usuário tem um iPhone com tela de 3,5 "ou 4" e aplicar o Visão.
Como devo fazer isso?
Respostas:
Primeiro, você não deve reconstruir todas as suas visualizações para caber em uma nova tela, nem usar diferentes visualizações para diferentes tamanhos de tela.
Use o redimensionamento automático recursos de do iOS, para que suas visualizações possam ajustar e adaptar qualquer tamanho de tela.
Isso não é muito difícil, leia alguma documentação sobre isso. Isso economizará muito tempo.
O iOS 6 também oferece novos recursos sobre isso.
Certifique-se de ler o log de alterações da API do iOS 6 no site da Apple Developer.
E verifique os novos recursos do iOS 6 AutoLayout .
Dito isto, se você realmente precisa detectar o iPhone 5, pode simplesmente confiar no tamanho da tela .
A tela do iPhone 5 tem uma altura de 568.
Você pode imaginar uma macro para simplificar tudo isso:
O uso de
fabs
com o epsilon está aqui para evitar erros de precisão ao comparar pontos flutuantes, conforme apontado nos comentários de H2CO3.Portanto, a partir de agora você pode usá-lo nas instruções if / else padrão:
Editar - Melhor detecção
Como afirmado por algumas pessoas, isso se limita a detectar uma widescreen , não um iPhone 5 real.
As próximas versões do iPod touch talvez também tenham essa tela, para que possamos usar outro conjunto de macros.
Vamos renomear a macro original
IS_WIDESCREEN
:E vamos adicionar macros de detecção de modelo:
Dessa forma, podemos garantir que temos um modelo de iPhone E uma tela widescreen e podemos redefinir a
IS_IPHONE_5
macro:Observe também que, conforme declarado pelo @ LearnCocos2D, essas macros não funcionarão se o aplicativo não for otimizado para a tela do iPhone 5 (sem a imagem [email protected]), pois o tamanho da tela ainda será 320x480. um caso.
Eu não acho que isso possa ser um problema, pois não vejo por que queremos detectar um iPhone 5 em um aplicativo não otimizado.
IMPORTANTE - suporte para iOS 8
No iOS 8, a
bounds
propriedade daUIScreen
classe agora reflete a orientação do dispositivo .Então, obviamente, o código anterior não funcionará imediatamente.
Para corrigir isso, você pode simplesmente usar a nova
nativeBounds
propriedade, em vez debounds
, pois ela não muda com a orientação e como se baseia no modo de retrato.Observe que as dimensões de
nativeBounds
são medidas em pixels; portanto, para um iPhone 5, a altura será 1136 em vez de 568.Se você também está segmentando o iOS 7 ou inferior, use a detecção de recursos, pois as chamadas
nativeBounds
anteriores ao iOS 8 causam um travamento no aplicativo:Você pode adaptar as macros anteriores da seguinte maneira:
E, obviamente, se você precisar detectar um iPhone 6 ou 6 Plus, use os tamanhos de tela correspondentes.
fonte
#define IS_IPHONE_5 ( [ [ UIScreen mainScreen ] bounds ].size.height == 568 )
DBL_EPSILON
não é necessária aqui e que a==
comparação não falhará: é necessário fazer comparação usando diferenças dessa maneira se o valor do ponto flutuante não puder ser expresso como um número exato (como1.0/3.0*3.0
por exemplo). Leia este artigo para obter mais informações;)Testado e projetado para qualquer combinação de SDK e SO:
Rápido
Tipos de iPad adicionados. O iPad 2 e o iPad mini são iPads sem retina. Enquanto o iPad Mini 2 e superior, o iPad 3, 4, o iPad Air, o Air 2, o Air 3 e o iPad Pro 9.7 têm a mesma resolução lógica de 1024. O iPad Pro tem o comprimento máximo de 1366. Referência
Veja em ação https://gist.github.com/hfossli/bc93d924649de881ee2882457f14e346
Nota: Se, por exemplo, o iPhone 6 estiver no modo ampliado, a interface do usuário será uma versão ampliada do iPhone 5. Essas funções não determinam o tipo de dispositivo, mas o modo de exibição, portanto, o iPhone 5 é o resultado desejado neste exemplo.
Objetivo-C
Uso: http://pastie.org/9687735
Nota: Se, por exemplo, o iPhone 6 estiver no modo ampliado, a interface do usuário será uma versão ampliada do iPhone 5. Essas funções não determinam o tipo de dispositivo, mas o modo de exibição, portanto, o iPhone 5 é o resultado desejado neste exemplo.
fonte
#define IS_RETINA ([[UIScreen mainScreen] scale] == 2.0)
o que irá ajudar a determinar a diferença entre ambos iPhone4 e iPhone5 e iPad Retina e não-retinaSCREEN_MAX_LENGTH
para obter 568 em todas as rotações no iPhone 5.Solução realmente simples
fonte
Agora precisamos contabilizar os tamanhos de tela do iPhone 6 e 6Plus. Aqui está uma resposta atualizada
Algumas informações úteis
fonte
Tomei a liberdade de colocar a macro do Macmade em uma função C e nomeie-a corretamente, pois detecta a disponibilidade de widescreen e NÃO necessariamente o iPhone 5.
A macro também não detecta a execução em um iPhone 5, caso o projeto não inclua o [email protected] . Sem a nova imagem padrão, o iPhone 5 reportará um tamanho de tela normal de 480x320 (em pontos). Portanto, a verificação não é apenas para disponibilidade de tela widescreen, mas também para o modo widescreen .
fonte
inline
d. Eles também serão informados onde o otimizador do compilador acha que é uma boa ideia e onde pode saber que é permitido (por exemplo, a função está no mesmo módulo). Implementar coisas como essa por meio de uma função às vezes pode trazer verificação de tipo adicional.Aqui estão nossos códigos, teste passado no ios7 / ios8 para iphone4, iphone5, ipad, iphone6, iphone6p, independentemente de dispositivos ou simuladores:
fonte
Usei a resposta de hfossli e a traduzi para Swift
fonte
essa é a macro para o meu projeto cocos2d. deve ser o mesmo para outros aplicativos.
fonte
fonte
No Swift, projeto iOS 8+, eu gosto de fazer uma extensão
UIScreen
, como:(NOTA:
nativeBounds
está em pixels).E então o código será como:
Portanto, o código deixa claro que essa é uma verificação para a tela principal, não para o modelo do dispositivo.
fonte
Tomando emprestado a resposta de Samrat Mazumdar, aqui está um método curto que estima o tamanho da tela do dispositivo. Funciona com os dispositivos mais recentes, mas pode falhar em dispositivos futuros (como todos os métodos de adivinhação). Também ficará confuso se o dispositivo estiver sendo espelhado (retorna o tamanho da tela do dispositivo, não o tamanho da tela espelhada)
fonte
Eu acho que seria bom se essa macro funcionasse no dispositivo e no simulador, abaixo está a solução.
fonte
Descobri que as respostas não incluem um caso especial para simuladores.
fonte
fonte
iPhone5 = FALSE;
é desnecessário porque a variável já esse valor se não mudoufonte
Confiar no tamanho está errado em muitos níveis. Que tal pedirmos ao sistema?
Retirado da melhor maneira de detectar o tipo de hardware, iPhone4 ou iPhone5? , resposta edzio27.
fonte
Dessa forma, você pode detectar a família de dispositivos.
fonte
Se o projeto for criado usando o Xcode 6, use o código abaixo mencionado para detectar os dispositivos.
Se o projeto foi criado no Xcode 5 e aberto no Xcode 6, use o código abaixo mencionado para detectar os dispositivos (esse código funcionará se nenhuma imagem de inicialização do iPhone 6,6+ estiver atribuída)
Se você ainda estiver usando o Xcode 5 juntos, use o código a seguir para detectar os dispositivos (o iPhone 6 e 6+ não serão detectados)
fonte
Adicione um 'Novo arquivo Swift' ->
AppDelegateEx.swift
adicione uma extensão a
AppDelegate
uso:
fonte
No Swift 3, você pode usar minha classe simples KRDeviceType.
https://github.com/ulian-onua/KRDeviceType
É bem documentado e suporta operadores ==,> =, <=.
Por exemplo, para detectar se o dispositivo tem limites de iPhone 6 / 6s / 7, você pode apenas usar a próxima comparação:
Para detectar se o dispositivo possui limites do iPhone 5 / 5S / SE ou anterior (iPhone 4s), você pode usar a próxima comparação:
fonte
Isso já foi respondido centenas de vezes, mas essa solução funcionou melhor para mim e ajudou a solucionar o problema quando novos dispositivos são introduzidos e eu não tenho um tamanho definido.
Ajudante do Swift 5:
Isso ocorre porque é fácil memorizar os tamanhos de polegada de um telefone, como dispositivo de "5,5 polegadas" ou "4,7 polegadas", mas é difícil lembrar os tamanhos exatos de pixels.
Isso também lhe dá a oportunidade de fazer algo assim:
O padrão: tenta usar o tamanho e a escala da tela para tentar calcular as polegadas diagonais. Isso acontece se algum novo tamanho de dispositivo aparecer, ele tentará o seu melhor para determinar e o código, como o último exemplo, ainda deve funcionar.
fonte
use o seguinte código:
fonte
Aqui está o teste correto do dispositivo, sem depender da orientação
fonte
Usado para detectar dispositivos iPhone e iPad de todos os versons.
fonte
IS_RETINA
em um iPhone 6 plus, o código 1x é executado?@1x
, onde cederão@3x
. de qualquer maneira: como você está simplesmente copiando e colando: -1