Existe um sinalizador específico do compilador xcode que é definido ao compilar para iPad?
-
23-09-2019 - |
Pergunta
Existe um sinalizador específico do compilador xcode que é definido ao compilar para iPad?
Quero compilar condicionalmente o código iPad vs iPhone/iPod Touch, por exemplo:
#ifdef TARGET_IPAD
code for iPad
#else
code for iPhone
#endif
Eu sei que já existem Target_OS_IPHONE e Target_CPU_ARM em TargetConditions.h, mas qualquer coisa que tem como alvo de maneira fácil e específica o iPad?
-Ei
Solução
A API correta a ser usada para verificação do tempo de execução do iPad vs. iPhone/iPad Touch é:
BOOL deviceIsPad = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
O arquivador do cabeçalho Uidevice também inclui uma macro conveniente, UI_USER_INTERFACE_IDIOM (), que será útil se o seu destino de implantação for <iPhone 3.2.
#define UI_USER_INTERFACE_IDIOM() ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone)
Então você pode apenas dizer, negativamente:
BOOL deviceIsPad = (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone);
Outras dicas
Em vez de usar sinalizadores de tempo de compilação, você deve usar o tempo de execução, por exemplo, uso NSClassFromString
Para ver se existe uma classe porque o mesmo aplicativo pode ser instalado nos dois dispositivos.
E devido à possibilidade de executar o aplicativo em ambos os dispositivos, não há uma verificação de tempo de compilação interna se ele tem como alvo o iPad ou não.
Atualmente, não encontrei nada que permitisse verificar se você está em um iPad, mas também não tenho certeza se a Apple recomenda verificações de tempo de execução. Aqui está um trecho da Apple:
Além dos controladores de exibição, quaisquer classes compartilhadas entre os dispositivos iPhone e iPad precisam incluir macros de compilação condicional para isolar o código específico do dispositivo. Embora você também possa usar verificações de tempo de execução para determinar se as classes ou métodos específicos estavam disponíveis, isso aumentaria apenas o tamanho do seu executável adicionando caminhos de código que não seriam seguidos em um dispositivo ou outro. Deixar o compilador remover este código ajuda a manter seu código mais limpo.
No entanto, não há lugar para encontrar informações mais específicas sobre macros de compilação condicional.
Para vários alvos que compartilham o mesmo projeto/código, estou fazendo isso editando os sinalizadores C para o meu alvo do iPad.
Com o alvo [MyApp] -Ipad escolhido como alvo ativo, escolha Projeto-> Editar Target Ativo [MyApp] -Ipad. Pesquise por "sinalizadores C" e clique duas vezes. Adicione um sinalizador para "-d Target_ipad". Agora, o símbolo Target_IPAD será definido apenas para o seu alvo do iPad.
Obviamente, isso só funciona se você estiver usando alvos separados para iPad e iPhone. Se você está executando o mesmo binário em ambos, obviamente não há nada que o compilador possa fazer por você. (No entanto, o 3.2 SDK no final de janeiro ainda nem suporta aplicativos universais.)
(Editado; fiquei confuso sobre a terminologia dos aplicativos "Universal" etc.)
Ou -> apenas para ter certeza
-(BOOL)isDeviceAniPad
{
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
BOOL deviceIsPad = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
return deviceIsPad;
#endif
return NO;
}
Eu acho que isso vai fazer
-(BOOL)isDeviceAniPad
{
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
return ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
#endif
return NO;
}