Existe um sinalizador específico do compilador xcode que é definido ao compilar para iPad?

StackOverflow https://stackoverflow.com/questions/2159951

  •  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

Foi útil?

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;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top