iOS가 사용자가 iPad에 있는지 감지


260

iPhone 및 iPod Touch에서 실행되는 앱이 있는데 Retina iPad에서 실행할 수 있지만 모든 조정이 필요합니다. 현재 기기가 iPad인지 감지해야합니다. 사용자가 내 iPad를 사용하고 있는지 감지 UIViewController한 다음 그에 따라 무언가를 변경 하는 데 어떤 코드를 사용할 수 있습니까?

답변:


589

기기가 iPad인지 확인하는 방법에는 여러 가지가 있습니다. 이것은 장치가 실제로 iPad인지 확인하는 가장 좋아하는 방법입니다.

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

내가 사용하는 방식

#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. */
}   

다른 예

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

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

Swift 솔루션에 대해서는 다음 답변을 참조하십시오 : https://stackoverflow.com/a/27517536/2057171


23
당신이 그것을 사용하는 방식은 가능한 효율적이지 않습니다. UI_USER_INTERFACE_IDIOM()와 같습니다 ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone). 어딘가에 결과를 캐싱하는 것이 좋습니다 BOOL iPad = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad; … if (iPad) ….
Marcelo Cantos

7
마지막 메소드에서 isEqualToString 대신 hasPrefix를 사용합니다. 이런 식으로 코드는 시뮬레이터에서도 작동합니다.
elbuild

18
스위프트 :if UIDevice.currentDevice().userInterfaceIdiom == .Pad
Pang

2
매크로의 대단한 사용. 코드를 난독 처리하는 좋은 방법입니다.
gnasher729

2
@ gnasher729 500 명 이상이 귀하의 의견에 동의하지 않는 경향이 있습니다. 엉뚱한 의견 대신에 더 좋은 방법이 있다고 생각하기 때문에 자신의 답변을 제공하지 않는 이유는 무엇입니까?
WrightsCS

162

Swift 에서는 다음과 같은 평등을 사용하여 Universal 앱 의 장치 종류 를 결정할 수 있습니다 .

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

그러면 사용법 은 다음과 같습니다.

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

3
승인 된 답변에 대한 답변 링크를 수정하고 있습니다. (이 방법으로도 신용을 얻습니다). 이것은 객관적인 질문이지만,이 질문을 보는 많은 사람들이 Google에서 왔으며 Swift 솔루션을 찾고있을 수 있습니다! : D
Albert Renshaw

1
감사합니다, @AlbertRenshaw. 나도 그렇게 생각했다. :) Btw : 나는이 질문의 의도가 Objective-C를 특별히 요구하는 것이 아니라 iOS (현재 Obj-C)를 요구하는 것이라고 생각하지 않습니다. 적어도 나는이 질문에서 Swift에 대한 답을 찾을 것으로 기대했을 것입니다.
Jeehut

@sevensevens 님, 피드백에 감사드립니다. 방금 이것을 시도해 보았고 시뮬레이터에서 iOS 9를 대상으로하는 XCode 7.2에서 작동했습니다. 어떤 XCode 버전을 사용하고 있습니까? 구형 XCode에서는 작동하지 않을 수 있습니까? 문서 userInterfaceIdiom는 'iOS 3.2 이상에서 사용 가능' 이라고 말합니다 . 문제가되지 않아야합니다.
Jeehut

아니면 iPad 시뮬레이터에서 iPhone 전용 앱을 실행하고있을 수 있습니까? 이 경우 혼란을 설명 할 수 있지만 실제 장치에서도 이러한 방식으로 작동해야한다고 생각합니다. @Yunus Nedim Mehel이 @Richards의 의견에서 지적한 것처럼 상황은 .Phone대신에 반환 됩니다 .Pad.
Jeehut

죄송합니다. 시뮬레이터를 iPhone으로 설정했습니다. 오전 2시
7

35

이것은 iOS 3.2부터 UIDevice의 일부입니다. 예 :

[UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad

4
관용구가 일반적으로 더 좋지만 iPad에서 iPhone 앱을 실행하는 경우 UIUserInterfaceIdiomPhone이 반환됩니다.
Yunus Nedim Mehel

25

이것을 사용할 수도 있습니다

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

24

UI_USER_INTERFACE_IDIOM()앱이 iPad 또는 Universal 용인 경우에만 iPad를 반환합니다. iPhone 앱이 iPad에서 실행되는 경우 그렇지 않습니다. 따라서 모델을 대신 확인해야합니다.


15

주의 : 앱이 iPhone 기기 만 대상으로하는 경우 iPhone 호환 모드로 실행되는 iPad는 아래 설명에 대해 false를 반환합니다.

#define IPAD     UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad

실제 iPad 장치를 감지하는 올바른 방법은 다음과 같습니다.

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

15

Xcode의 Simulator에서 일부 솔루션이 작동하지 않는 것으로 나타났습니다. 대신, 이것은 작동합니다 :

ObjC

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

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

빠른

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

또한 Xcode의 '기타 예제'에서 장치 모델은 'iPad Simulator'로 다시 표시되므로 위의 조정을 통해 정렬해야합니다.


어쩌면 Apple은 시뮬레이터를 업데이트하여 "iPad simulator"또는 "iPad 2.1"또는 이와 유사한 것을 말할 수 있습니다. hasSuffix:@"iPad"대신 사용할 수있는 경우 isEqualToString@"iPad"... 가장 좋은 방법은 시뮬레이터가 반환하고 이동하는 장치 모델을 기록하는 것입니다 거기에서 ...
앨버트 Renshaw

8

Swift 에서 여러 가지 방법으로 수행 할 수 있습니다 .

아래 모델을 확인합니다 (여기서는 대소 문자 구분 검색 만 가능).

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

아래 모델을 확인합니다 (여기에서 대소 문자 구분 / 무 감지 검색을 수행 할 수 있음).

    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().userInterfaceIdiom아래는 앱이 iPad 또는 Universal 용인 경우에만 iPad를 반환합니다. iPad에서 실행되는 iPhone 앱인 경우에는 그렇지 않습니다. 따라서 모델을 대신 확인해야합니다. :

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

아래의 스 니펫은 클래스가를 상속하지 않으면 컴파일되지 않으며 UIViewController그렇지 않으면 제대로 작동합니다. 에 관계없이 UI_USER_INTERFACE_IDIOM()앱을 아이 패드 또는 유니버설을위한 경우에만 아이 패드를 반환합니다. iPad에서 실행되는 iPhone 앱인 경우에는 그렇지 않습니다. 따라서 모델을 대신 확인해야합니다. :

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

2
Objective-C 태그가 붙은 질문에 대한 오래된 답변을 신속하게 다시 작성해야한다고 생각하지 않습니다.
Christian Schnorr

4
나는 모든 대답이 스택 오버플로에 흩어져 있기 때문에 내 대답이 유용하다고 생각합니다. 두 번째로 이전 버전의 iOS에서 작동했던 것이 때때로 iOS 8 이상에서 제대로 작동하지 않습니다. 따라서이 솔루션을 테스트 했으며이 답변이 매우 유용 할 수 있습니다. 그래서 나는 당신에게 전혀 동의하지 않습니다.
킹 위저드

그 외에도 Swift에서는 구문이 다릅니다. 따라서 모든 사람이 지능적으로 답변을 복사하여 특정 최신 너트와 볼트를 이해하는 것이 유용합니다.
킹 위저드


8

*

스위프트 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

많은 답변이 좋지만 스위프트 4에서 이와 같이 사용합니다.

  1. 상수 만들기

    struct App {
        static let isRunningOnIpad = UIDevice.current.userInterfaceIdiom == .pad ? true : false
    }
  2. 이런 식으로 사용

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

편집 : 제안 Cœur 단순히 UIDevice에 확장을 만들

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

3
확장으로 App똑같이 할 수있을 때 왜 구조체를 귀찮게 UIDevice합니까?
Cœur

3

rangeOfString을 확인하여 iPad라는 단어가 이와 같은지 확인할 수 있습니다.

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 != NSNotFoundtrue를 반환합니다.
Cœur

2

또 다른 Swifty 방식 :

//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 }
}

용법:

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

에서 스위프트 4.2 및 엑스 코드 (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
}

특정 장치를 감지하려는 경우

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

왜 그렇게 복잡한가? 이것이 내가하는 방법입니다 ...

스위프트 4 :

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

이렇게하면 그냥 말할 수 있습니다 if iPad {}


1
참고 :이 질문은 2012 년에 요청되었습니다
Albert Renshaw

0

최신 버전의 iOS의 경우 다음을 추가하기 만하면됩니다 UITraitCollection.

extension UITraitCollection {

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

그런 다음 UIViewController확인하십시오 :

if traitCollection.isIpad { ... }

4
iPad-App이 화면 분할 모드 일 때도 작동합니까? 그러면 가로 크기 클래스는 작습니다.
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");
  }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.