iOS phát hiện nếu người dùng ở trên iPad


260

Tôi có một ứng dụng chạy trên iPhone và iPod Touch, nó có thể chạy trên iPad Retina và mọi thứ nhưng cần phải có một điều chỉnh. Tôi cần phát hiện xem thiết bị hiện tại có phải là iPad không. Tôi có thể sử dụng mã nào để phát hiện nếu người dùng đang sử dụng iPad trong tôi UIViewControllervà sau đó thay đổi thứ gì đó cho phù hợp?

Câu trả lời:


589

Có khá nhiều cách để kiểm tra xem một thiết bị có phải là iPad hay không. Đây là cách yêu thích của tôi để kiểm tra xem thiết bị có thực sự là iPad hay không:

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

Cách tôi sử dụng nó

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

Những ví dụ khác

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

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

Để biết giải pháp Swift, hãy xem câu trả lời này: https://stackoverflow.com/a/27517536/2057171


23
Cách bạn sử dụng nó không hiệu quả như nó có thể. UI_USER_INTERFACE_IDIOM()tương đương với ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone). Bạn có thể tốt hơn tắt bộ nhớ đệm kết quả ở đâu đó : BOOL iPad = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad; … if (iPad) ….
Marcelo Cantos

7
Tôi sẽ sử dụng hasPrefix chứ không phải isEqualToString trong phương thức cuối cùng của bạn. Theo cách này, mã cũng hoạt động trên trình giả lập.
elbuild

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

2
Sử dụng hợp pháp của macro. Cách tuyệt vời để làm xáo trộn mã của bạn.
gnasher729

2
@ gnasher729 500+ người có xu hướng không đồng ý với bạn. Thay vì những bình luận lén lút, tại sao bạn không cung cấp câu trả lời của riêng mình vì bạn nghĩ rằng bạn có cách tốt hơn để làm điều này.
WrightsCS

162

Trong Swift, bạn có thể sử dụng các điểm tương đương sau để xác định loại thiết bị trên ứng dụng Universal:

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

Cách sử dụng sau đó sẽ là một cái gì đó như:

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

3
Tôi đang chỉnh sửa một liên kết đến câu trả lời của bạn thành câu trả lời được chấp nhận. (Cách này bạn cũng nhận được tín dụng). Mặc dù đây là một câu hỏi khách quan, rất nhiều người xem câu hỏi này đến từ Google và có thể đang tìm kiếm một giải pháp Swift! : D
Albert Renshaw

1
Cảm ơn bạn, @AlbertRenshaw. Tôi cũng nghĩ vậy :) Btw: Tôi không nghĩ mục đích của câu hỏi là hỏi cụ thể về Objective-C, nhưng đối với iOS (lúc đó là Obj-C). Ít nhất tôi cũng mong sẽ tìm được câu trả lời cho câu hỏi này cho Swift.
Jeehut

Xin chào @sevensevens, cảm ơn bạn đã phản hồi. Tôi mới thử cái này và nó đã hoạt động với tôi trong XCode 7.2 nhắm mục tiêu iOS 9 trong trình giả lập. Phiên bản XCode nào bạn đang sử dụng? Có lẽ nó không hoạt động trên XCodes cũ? Các tài liệu nói userInterfaceIdiomlà 'Có sẵn trong iOS 3.2 trở lên.' vì vậy đó không phải là vấn đề.
Jeehut

Hoặc có thể là bạn đang chạy một ứng dụng chỉ dành cho iPhone trên trình giả lập iPad? Trong trường hợp đó, điều đó sẽ giải thích sự nhầm lẫn - nhưng tôi cũng nên hành xử theo cách này trên các thiết bị thực, tôi nghĩ vậy. Như @Yunus Nedim Mehel chỉ ra trong các bình luận của @Richards trả lời rằng tình huống sẽ trở lại .Phonethay vì .Pad.
Jeehut

Xin lỗi - đã cài đặt trình giả lập thành iPhone. Phải ngừng thay đổi vào lúc 2 giờ sáng
Sevensevens

35

Đây là một phần của UIDevice kể từ iOS 3.2, ví dụ:

[UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad

4
thành ngữ nói chung là tốt hơn nhưng nếu bạn đang chạy một ứng dụng iphone trên iPad thì điều này sẽ trả về UIUserInterfaceIdiomPhone.
Yunus Nedim Mehel 18/12/13

25

Bạn cũng có thể sử dụng cái này

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

24

UI_USER_INTERFACE_IDIOM()chỉ trả lại iPad nếu ứng dụng dành cho iPad hoặc Universal. Nếu đó là một ứng dụng iPhone chạy trên iPad thì nó sẽ không hoạt động. Vì vậy, bạn nên thay vì kiểm tra mô hình.


15

Hãy cẩn thận: Nếu ứng dụng của bạn chỉ nhắm mục tiêu đến thiết bị iPhone, iPad chạy với chế độ tương thích với iphone sẽ trả về sai cho tuyên bố dưới đây:

#define IPAD     UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad

Cách đúng để phát hiện thiết bị iPad vật lý là:

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

15

Tôi thấy rằng một số giải pháp không hoạt động với tôi trong Trình mô phỏng trong Xcode. Thay vào đó, điều này hoạt động:

ObjC

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

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

Nhanh

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

Ngoài ra, trong 'Ví dụ khác' trong Xcode, kiểu thiết bị quay trở lại là 'Trình mô phỏng iPad', do đó, tinh chỉnh trên sẽ sắp xếp nó ra.


Có thể Apple đã cập nhật trình giả lập để nói một cái gì đó như "Trình giả lập iPad" hoặc "iPad 2.1" hoặc một cái gì đó ... nếu đó là trường hợp bạn có thể sử dụng hasSuffix:@"iPad"thay vì isEqualToString@"iPad"... cách tốt nhất của bạn là Đăng nhập mô hình thiết bị mà trình giả lập quay lại và đi từ đó ...
Albert Renshaw

8

Nhiều cách để làm điều đó trong Swift :

Chúng tôi kiểm tra mô hình bên dưới (chúng tôi chỉ có thể thực hiện tìm kiếm phân biệt chữ hoa chữ thường ở đây):

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

Chúng tôi kiểm tra mô hình bên dưới (chúng tôi có thể thực hiện tìm kiếm trường hợp nhạy cảm / không nhạy cảm ở đây):

    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().userInterfaceIdiombên dưới chỉ trả về iPad nếu ứng dụng dành cho iPad hoặc Universal. Nếu đó là một ứng dụng iPhone đang chạy trên iPad thì nó sẽ không hoạt động. Vì vậy, bạn nên thay vì kiểm tra mô hình. :

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

Đoạn mã dưới đây không biên dịch nếu lớp không kế thừa một UIViewController, nếu không nó hoạt động tốt. Bất kể UI_USER_INTERFACE_IDIOM()chỉ trả lại iPad nếu ứng dụng dành cho iPad hoặc Universal. Nếu đó là một ứng dụng iPhone đang chạy trên iPad thì nó sẽ không hoạt động. Vì vậy, bạn nên thay vì kiểm tra mô hình. :

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

2
Tôi không nghĩ cần phải viết lại câu trả lời cũ cho các câu hỏi được gắn thẻ Objective-C để nhanh chóng.
Christian Schnorr

4
Tôi chắc chắn nghĩ rằng câu trả lời của tôi là hữu ích bởi vì trước hết tất cả các câu trả lời nằm rải rác trên stack stack. Thứ hai, những gì hoạt động với các phiên bản iOS cũ hơn đôi khi không hoạt động chính xác với iOS 8 trở lên. Vì vậy, tôi đã thử nghiệm các giải pháp này và câu trả lời này có thể rất hữu ích. Vì vậy, tôi không đồng ý với bạn cả.
Vua-Phù thủy

Trên hết, cú pháp là khác nhau trong Swift. Vì vậy, nó luôn hữu ích cho mọi người để thực hiện một bản sao thông minh của câu trả lời và hiểu các loại hạt và bu lông cập nhật cụ thể.
King-Wizard


8

*

Trong 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

Nhiều câu trả lời là tốt nhưng tôi sử dụng như thế này trong swift 4

  1. Tạo liên tục

    struct App {
        static let isRunningOnIpad = UIDevice.current.userInterfaceIdiom == .pad ? true : false
    }
  2. Sử dụng như thế này

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

Chỉnh sửa: Như đã đề xuất, chỉ cần tạo tiện ích mở rộng trên UIDevice

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

3
Tại sao phải bận tâm với một Appcấu trúc khi bạn có thể làm tương tự với một UIDevicephần mở rộng?
Cœur

3

Bạn có thể kiểm tra phạm viOfString để xem từ iPad tồn tại như thế này.

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 != NSNotFoundtrả về đúng
Cœur

2

Một cách khác của 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 }
}

Sử dụng:

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

Trong Swift 4.2 và 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
}

Nếu bạn muốn phát hiện thiết bị cụ thể

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

Sao lại phức tạp thế? Đây là cách tôi làm ...

Swift 4:

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

Bằng cách này bạn chỉ có thể nói if iPad {}


1
Lưu ý: Câu hỏi này đã được hỏi vào năm 2012
Albert Renshaw

0

Đối với các phiên bản iOS mới nhất, chỉ cần thêm UITraitCollection:

extension UITraitCollection {

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

và sau đó trong vòng UIViewControllerkiểm tra:

if traitCollection.isIpad { ... }

4
Điều này cũng hoạt động khi Ứng dụng iPad ở Chế độ chia màn hình? Sau đó, lớp kích thước ngang sẽ nhỏ gọn.
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");
  }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.