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?

Albert Renshaw
fonte

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

WrightsCS
fonte
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
}
Jeehut
fonte
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
Richard
fonte
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
}
Frio
fonte
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.

malhal
fonte
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"])
pico
fonte
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.

Andy Davies
fonte
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
    }
}
O rei da bruxaria
fonte
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
    }
Ashok R
fonte
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
}
Rohit Sisodia
fonte
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");
}
LearningGuy
fonte
["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!
}
Aviel Gross
fonte
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
}
iOS
fonte
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 {}

The Ruffus
fonte
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 { ... }
Bartłomiej Semańczyk
fonte
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");
  }
Rajesh Sharma
fonte