O iOS detecta se o usuário está em um iPad


260

Eu tenho um aplicativo que roda no iPhone e no iPod Touch, ele pode rodar no iPad Retina e tudo mais, mas é necessário um ajuste. Preciso detectar se o dispositivo atual é um iPad. Que código posso usar para detectar se o usuário está usando um iPad no meu UIViewControllere depois alterar alguma coisa de acordo?

Respostas:


589

Existem várias maneiras de verificar se um dispositivo é um iPad. Esta é a minha maneira favorita de verificar se o dispositivo é de fato um iPad:

if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad )
{
    return YES; /* Device is iPad */
}

Do jeito que eu uso

#define IDIOM    UI_USER_INTERFACE_IDIOM()
#define IPAD     UIUserInterfaceIdiomPad

if ( IDIOM == IPAD ) {
    /* do something specifically for iPad. */
} else {
    /* do something specifically for iPhone or iPod touch. */
}   

Outros exemplos

if ( [(NSString*)[UIDevice currentDevice].model hasPrefix:@"iPad"] ) {
    return YES; /* Device is iPad */
}

#define IPAD     (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
if ( IPAD ) 
     return YES;

Para uma solução Swift, consulte esta resposta: https://stackoverflow.com/a/27517536/2057171


23
O modo como você o usa não é tão eficiente quanto poderia ser. UI_USER_INTERFACE_IDIOM()é equivalente a ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone). Você pode ser melhor fora de cache a algum lugar resultado: BOOL iPad = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad; … if (iPad) ….
— Marcelo Cantos

7
Eu usaria hasPrefix em vez de isEqualToString no seu último método. Dessa maneira, o código também funciona no simulador.
— elbuild

18
Swift:if UIDevice.currentDevice().userInterfaceIdiom == .Pad
— Pang

2
Uso legal de macros. Ótima maneira de ofuscar seu código.
— precisa saber é o seguinte

2
@ gnasher729 Mais de 500 pessoas tendem a discordar de você. Em vez dos comentários sarcásticos, por que você não fornece sua própria resposta, pois acha que tem uma maneira melhor de fazer isso.
— amigos estão dizendo sobre wrightsCS

162

No Swift, você pode usar as seguintes igualdades para determinar o tipo de dispositivo nos aplicativos universais:

UIDevice.current.userInterfaceIdiom == .phone
// or
UIDevice.current.userInterfaceIdiom == .pad

O uso seria então algo como:

if UIDevice.current.userInterfaceIdiom == .pad {
    // Available Idioms - .pad, .phone, .tv, .carPlay, .unspecified
    // Implement your logic here
}

3
Estou editando um link para sua resposta na resposta aceita. (Dessa forma, você também recebe crédito). Embora essa seja uma pergunta objetiva-c, muitas pessoas que a visualizam vêm do Google e podem estar procurando uma solução Swift! : D
— Albert Renshaw

1
Obrigado, @AlbertRenshaw. Também achei. :) Btw: Eu não acho que a intenção da pergunta era perguntar especificamente pelo Objective-C, mas pelo iOS (que era o Obj-C naquele momento). Pelo menos eu esperaria encontrar a resposta nesta pergunta para Swift também.
— Jeehut

Olá @sevensevens, obrigado pelo seu feedback. Eu apenas tentei isso e funcionou para mim no XCode 7.2 visando o iOS 9 no simulador. Qual versão do XCode você está usando? Talvez não funcione em XCodes mais antigos? Os documentos dizem que userInterfaceIdiom'está disponível no iOS 3.2 e posterior'. então esse não deveria ser o problema.
— Jeehut

Ou será que você está executando um aplicativo somente para iPhone no simulador de iPad? Nesse caso, isso explicaria a confusão - mas também deveria se comportar dessa maneira em dispositivos reais, eu acho. Como @Yunus Nedim Mehel aponta nos comentários da resposta de @Richards, essa situação retornará em .Phonevez de .Pad.
— Jeehut

Desculpe - tinha o simulador definido para o iPhone. Tenho que parar de fazer alterações às
— 02:00

35

Isso faz parte do UIDevice a partir do iOS 3.2, por exemplo:

[UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad

4
O idioma geralmente é melhor, mas se você estiver executando um aplicativo para iPhone no iPad, isso retornará o UIUserInterfaceIdiomPhone.
— Yunus Nedim Mehel

25

Você também pode usar isso

#define IPAD UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad
...
if (IPAD) {
   // iPad
} else {
   // iPhone / iPod Touch
}

24

UI_USER_INTERFACE_IDIOM()retorna o iPad apenas se o aplicativo for para iPad ou Universal. Se for um aplicativo para iPhone rodando em um iPad, não será. Então, você deve verificar o modelo.


15

Cuidado: se o seu aplicativo estiver direcionado apenas para o dispositivo iPhone, o iPad em execução no modo compatível com o iphone retornará falso para a declaração abaixo:

#define IPAD     UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad

A maneira correta de detectar um dispositivo físico para iPad é:

#define IS_IPAD_DEVICE      ([(NSString *)[UIDevice currentDevice].model hasPrefix:@"iPad"])

15

Descobri que alguma solução não funcionava para mim no Simulador no Xcode. Em vez disso, isso funciona:

ObjC

NSString *deviceModel = (NSString*)[UIDevice currentDevice].model;

if ([[deviceModel substringWithRange:NSMakeRange(0, 4)] isEqualToString:@"iPad"]) {
    DebugLog(@"iPad");
} else {
    DebugLog(@"iPhone or iPod Touch");
}

Rápido

if UIDevice.current.model.hasPrefix("iPad") {
    print("iPad")
} else {
    print("iPhone or iPod Touch")
}

Também em 'Outros exemplos' no Xcode, o modelo do dispositivo volta como 'iPad Simulator', de modo que o ajuste acima deve resolver isso.


Talvez a Apple tenha atualizado o simulador para dizer algo como "simulador de iPad" ou "iPad 2.1" ou algo assim ... se for esse o caso, você pode usar em hasSuffix:@"iPad"vez de isEqualToString@"iPad"... sua melhor aposta é registrar o modelo do dispositivo que o simulador retorna e continua de lá ...
— Albert Renshaw

8

Muitas maneiras de fazer isso no Swift :

Verificamos o modelo abaixo (só podemos fazer uma pesquisa que diferencia maiúsculas de minúsculas aqui):

class func isUserUsingAnIpad() -> Bool {
    let deviceModel = UIDevice.currentDevice().model
    let result: Bool = NSString(string: deviceModel).containsString("iPad")
    return result
}

Verificamos o modelo abaixo (podemos fazer uma pesquisa sensível a maiúsculas / minúsculas aqui):

    class func isUserUsingAnIpad() -> Bool {
        let deviceModel = UIDevice.currentDevice().model
        let deviceModelNumberOfCharacters: Int = count(deviceModel)
        if deviceModel.rangeOfString("iPad",
                                     options: NSStringCompareOptions.LiteralSearch,
                                     range: Range<String.Index>(start: deviceModel.startIndex,
                                                                end: advance(deviceModel.startIndex, deviceModelNumberOfCharacters)),
                                     locale: nil) != nil {
            return true
        } else {
            return false
        }
   }

UIDevice.currentDevice().userInterfaceIdiomabaixo retorna o iPad apenas se o aplicativo for para iPad ou Universal. Se for um aplicativo para iPhone rodando em um iPad, não será. Então, você deve verificar o modelo. :

    class func isUserUsingAnIpad() -> Bool {
        if UIDevice.currentDevice().userInterfaceIdiom == UIUserInterfaceIdiom.Pad {
            return true
        } else {
            return false
        }
   }

Este trecho abaixo não compila se a classe não herda de um UIViewController, caso contrário, ele funciona muito bem. Independentemente, ele UI_USER_INTERFACE_IDIOM()retorna o iPad apenas se o aplicativo for para iPad ou Universal. Se for um aplicativo para iPhone sendo executado em um iPad, não será. Então, você deve verificar o modelo. :

class func isUserUsingAnIpad() -> Bool {
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.Pad) {
        return true
    } else {
        return false
    }
}

2
Eu não acho que seja necessário reescrever respostas antigas para perguntas marcadas como Objective-C rapidamente.
— Christian Schnorr

4
Definitivamente, acho que minha resposta é útil porque, em primeiro lugar, todas as respostas estão espalhadas no estouro da pilha. Em segundo lugar, o que funcionou com versões mais antigas do iOS às vezes não funciona corretamente com o iOS 8 e superior. Então testei essas soluções e essa resposta pode ser altamente útil. Então, eu não concordo com você.
— King-Wizard

Além disso, a sintaxe é diferente no Swift. Portanto, é sempre útil que todos façam uma cópia inteligente da resposta e compreendam as porcas e parafusos atualizados atualizados.
— King-Wizard


8

*

No Swift 3.0

*

 if UIDevice.current.userInterfaceIdiom == .pad {
        //pad
    } else if UIDevice.current.userInterfaceIdiom == .phone {
        //phone
    } else if UIDevice.current.userInterfaceIdiom == .tv {
        //tv
    } else if UIDevice.current.userInterfaceIdiom == .carPlay {
        //CarDisplay
    } else {
        //unspecified
    }

8

Muitas respostas são boas, mas eu uso assim no Swift 4

  1. Criar constante

    struct App {
        static let isRunningOnIpad = UIDevice.current.userInterfaceIdiom == .pad ? true : false
    }
  2. Use assim

    if App.isRunningOnIpad {
        return load(from: .main, identifier: identifier)
    } else {
        return load(from: .ipad, identifier: identifier)
    }

Editar: Como sugerido, basta criar uma extensão no UIDevice

extension UIDevice {
    static let isRunningOnIpad = UIDevice.current.userInterfaceIdiom == .pad ? true : false
}

3
Por que se preocupar com uma Appestrutura quando você pode fazer o mesmo com uma UIDeviceextensão?
— Cœur

3

Você pode verificar o rangeOfString para ver se a palavra iPad existe assim.

NSString *deviceModel = (NSString*)[UIDevice currentDevice].model;

if ([deviceModel rangeOfString:@"iPad"].location != NSNotFound)  {
NSLog(@"I am an iPad");
} else {
NSLog(@"I am not an iPad");
}

["I am not an iPad" rangeOfString:@"iPad"].location != NSNotFoundretorna verdadeiro.
— Cœur

2

Mais uma maneira rápida:

//MARK: -  Device Check
let iPad = UIUserInterfaceIdiom.Pad
let iPhone = UIUserInterfaceIdiom.Phone
@available(iOS 9.0, *) /* AppleTV check is iOS9+ */
let TV = UIUserInterfaceIdiom.TV

extension UIDevice {
    static var type: UIUserInterfaceIdiom 
        { return UIDevice.currentDevice().userInterfaceIdiom }
}

Uso:

if UIDevice.type == iPhone {
    //it's an iPhone!
}

if UIDevice.type == iPad {
    //it's an iPad!
}

if UIDevice.type == TV {
    //it's an TV!
}

2

No Swift 4.2 e no Xcode 10

if UIDevice().userInterfaceIdiom == .phone {
    //This is iPhone
} else if UIDevice().userInterfaceIdiom == .pad { 
    //This is iPad
} else if UIDevice().userInterfaceIdiom == .tv {
    //This is Apple TV
}

Se você deseja detectar dispositivos específicos

let screenHeight = UIScreen.main.bounds.size.height
if UIDevice().userInterfaceIdiom == .phone {
    if (screenHeight >= 667) {
        print("iPhone 6 and later")
    } else if (screenHeight == 568) {
        print("SE, 5C, 5S")
    } else if(screenHeight<=480){
        print("4S")
    }
} else if UIDevice().userInterfaceIdiom == .pad { 
    //This is iPad
}

1

Por que tão complicado? É assim que eu faço ...

Swift 4:

var iPad : Bool {
    return UIDevice.current.model.contains("iPad")
}

Desta forma, você pode apenas dizer if iPad {}


1
Nota: Esta pergunta foi feita em 2012
— Albert Renshaw

0

Para as versões mais recentes do iOS, basta adicionar UITraitCollection:

extension UITraitCollection {

    var isIpad: Bool {
        return horizontalSizeClass == .regular && verticalSizeClass == .regular
    }
}

e depois UIViewControllerbasta verificar:

if traitCollection.isIpad { ... }

4
Isso também funciona quando o iPad-App está no modo de tela dividida? Então a classe de tamanho horizontal seria compacta.
— Oliver

0
if(UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.pad)
 {
            print("This is iPad")
 }else if (UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.phone)
 {
            print("This is iPhone");
  }
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.