2010-05-19 12 views
45

Powodem, dla którego muszę się dowiedzieć, jest to, że na iPadzie UIPickerView ma taką samą wysokość w orientacji poziomej, jak w przypadku portretu. Na iPhonie jest inaczej. Przewodnik programowania iPad wprowadza „idiom” wartość UIDevice:Najlepszy sposób programowego wykrywania sprzętu iPad/iPhone

UIDevice* thisDevice = [UIDevice currentDevice]; 
    if(thisDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad) 
    { 
     // iPad 
    } 
    else 
    { 
     // iPhone 
    } 

który działa OK, gdy jesteś w iPadzie (3.2), ale nie iPhone (3.1.3) - tak wygląda tam również musi być ifdef warunkowo skompilować ten czek, jak:

#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200 
     UIDevice* thisDevice = [UIDevice currentDevice]; 
     if(thisDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad) 
     { 
      // etc. 
     } 
#endif 

dla mnie to zaczyna wyglądać bardzo niezdarny. Jaki jest lepszy sposób?

Odpowiedz

24

mam odpowiedzi na to teraz (i na tym koniec danego dnia), ponieważ wiele z istniejących odpowiedzi są dość stare, a najbardziej Up Wziął rzeczywiście wydaje się być źle zgodnie z jabłkami prąd Docs (iOS 8.1, 2015)!

Aby udowodnić mój punkt widzenia, to jest komentarz z jabłek nagłówka pliku (zawsze szukać u źródła firmy Apple i nagłówków):

/*The UI_USER_INTERFACE_IDIOM() macro is provided for use when 
    deploying to a version of the iOS less than 3.2. If the earliest 
    version of iPhone/iOS that you will be deploying for is 3.2 or 
    greater, you may use -[UIDevice userInterfaceIdiom] directly.*/ 

Dlatego obecnie APPLE zaleca sposób wykrywania iPhone vs iPad przedstawia się następująco:

1) w wersjach iOS PRZED do 3,2, należy użyć Apple pod warunkiem makro:

// for iPhone use UIUserInterfaceIdiomPhone 
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 

2) W wersji iOS 3.2 lub później użyć właściwości w [UIDevice currentDevice]

// for iPhone use UIUserInterfaceIdiomPhone 
if([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) 
+0

Jeśli przejdziesz do definicji UI_USER_INTERFACE_IDIOM(), zobaczysz, że używa ona właściwości [[UIDevice currentDevice] userInterfaceIdiom]. 'rolki statyczne UIUserInterfaceIdiom UI_USER_INTERFACE_IDIOM() { zwrotny ([[UIDevice currentDevice] respondsToSelector: @selector (userInterfaceIdiom)] [[UIDevice currentDevice] userInterfaceIdiom] UIUserInterfaceIdiomPhone?)' – KarenAnne

+0

Yah! Tak znalazłem komentarz w ich dokumentach, który zacytowałem w tej odpowiedzi :) –

+0

Co mam na myśli, możesz użyć 'UI_USER_INTERFACE_IDIOM()' nawet w systemie iOS 3.2 lub późniejszym, ponieważ jest to to samo co '[UIDevice currentDevice] .userInterfaceIdiom ] '. Dobrze? – KarenAnne

17

Podoba mi się moja funkcja isPad(). Ten sam kod, ale trzymaj go poza zasięgiem wzroku i tylko w jednym miejscu.

61

Sprawdzanie w czasie wykonywania (Twoja pierwsza droga) jest zupełnie inne niż #if w czasie kompilacji. Preprocesorowe dyrektywy nie dadzą ci uniwersalnej aplikacji.

Preferowanym sposobem jest użycie Apple makro:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
{ 
    // The device is an iPad running iPhone 3.2 or later. 
} 
else 
{ 
    // The device is an iPhone or iPod touch. 
} 

Zastosowanie 3.2 jako SDK bazowej (ponieważ makro nie jest zdefiniowana wstępnie 3.2), można kierować wcześniejsze wersje systemu operacyjnego, aby to działa na iPhone .

0

umieścić tę metodę w swojej aplikacji Delegata tak, że można nazwać go w dowolnym miejscu za pomocą [[[UIApplication sharedApplication] delegat] ISPAD]

-(BOOL)isPad 
{ 
    BOOL isPad; 
    NSRange range = [[[UIDevice currentDevice] model] rangeOfString:@"iPad"]; 
    if(range.location==NSNotFound) 
    { 
     isPad=NO; 


    } 
    else { 
     isPad=YES; 
    } 

    return isPad; 
} 
+0

Pierwsza: Metoda "UI_USER_INTERFACE_IDIOM()" jest drogą do zrobienia. Po drugie: model twojego urządzenia się nie zmieni, więc oszczędzaj sobie cykle procesora i buforuj wynik w zmiennej statycznej i użyj 'dispatch_once'. – stigi

+0

Umieszczenie nowej funkcji gdzieś w aplikacji powoduje, że wszystkie osoby dzwoniące są zależne od klasy, w której ją wprowadzisz. Wywołanie jednej z funkcji API wydaje się lepsze. – Pat

0

Jeśli używasz funkcji, które nie są kompatybilne wstecz, znalazłem najlepszym sposobem dla mnie jest stworzenie # definicji w prekompilowanym nagłówku. Przykład:

#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_3_2 
#define USING_4_X 
#endif 

Następnie w kodzie, można to zrobić:

BOOL exists = NO; 
#ifdef USING_4_X   
exists = [SomeObject someMethod:[url lastPathComponent]]; 
#else 
exists = [SomeObject someMethod:[[url path] lastPathComponent]]; 
#endif 
+3

Twoje rozwiązanie spowoduje, że będziesz potrzebować dwóch wersji binarnych. – ruralcoder

14

moje rozwiązanie (działa na 3.2 lub nowszym):

#define IS_IPHONE (!IS_IPAD) 
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone) 

wtedy,

if (IS_IPAD) 
    // do something 

lub

if (IS_IPHONE) 
    // do something else 
+0

to miłe jeden i możemy #define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) #define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) to też możemy to zrobić dobrze ... dzięki znowu lewisanderson – Bala

+1

To nie jest Najlepsza logika do użycia, ponieważ w większości sytuacji iPod powinien być zgrupowany z iPhonem, a nie iPadem. – Nate

0

Jeśli 1- masz już aplikacja zainstalowana na urządzeniu, 2- zmienić jego ustawienia kompilacji być aplikacja „uniwersalny”, 3- zainstalować aplikację na swoim urządzeniu na górze Pre - istniejąca aplikacja (bez usuwania poprzedniej)

Może się okazać, że przedstawione tutaj rozwiązania do wykrywania iPhone'a/iPada nie działają. Najpierw usuń aplikację, która była "tylko" dla iPada/iPhone'a i zainstaluj ją na swoim urządzeniu.

0
BOOL isIpad() 
{ 
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
     return YES; 
    } 
    return NO; 
} 
1

Swift stosowania userInterfaceIdiom przykład własności AS

if UIDevice.current.userInterfaceIdiom == .phone { 
    print("iPhone") 
} 

& przypadku innych urządzeń -

switch UIDevice.current.userInterfaceIdiom { 
    case .pad: 
     print("iPad") 
    case .phone: 
     print("iPhone") 
    case .tv: 
     print("TV") 
    case .carPlay: 
     print("carPlay") 
    default: break; 
    } 
Powiązane problemy