Самый быстрый (самый грязный) способ сказать iPad с iPhone в Swift [дубликат]

Мне кажется, вы пытаетесь сопоставить теги без «/» в конце. Попробуйте следующее:

<([a-zA-Z][a-zA-Z0-9]*)[^>]*(?<!/)>
206
задан Bartłomiej Semańczyk 6 February 2017 в 14:36
поделиться

13 ответов

Вы можете проверить 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");
}
538
ответ дан Albert Renshaw 16 August 2018 в 00:25
поделиться
  • 1
    Замечательно! Спасибо! Только то, что я искал! :) – Albert Renshaw 16 April 2012 в 01:08
  • 2
    То, как вы его используете, не так эффективно, как могло бы быть. UI_USER_INTERFACE_IDIOM() эквивалентно ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone). Возможно, вам лучше кэшировать результат где-то: BOOL iPad = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad; … if (iPad) …. – Marcelo Cantos 16 February 2013 в 02:04
  • 3
    Я бы использовал hasPrefix, а не isEqualToString в вашем последнем методе. Таким образом, код работает и на симуляторе. – elbuild 27 September 2013 в 12:00
  • 4
    Swift: if UIDevice.currentDevice().userInterfaceIdiom == .Pad – Pang 9 August 2014 в 05:30
  • 5
    Хороший ответ :). – Albert Renshaw 3 September 2014 в 05:22
  • 6
    Я бы дважды голосовал, если мог ... – Henry Heleine 6 May 2015 в 15:41
  • 7
    ужасный ответ – Gustavo Baiocchi Costa 5 January 2017 в 15:56
  • 8
    ["I am not an iPad" rangeOfString:@"iPad"].location != NSNotFound возвращает значение true. – Cœur 6 February 2018 в 05:13

*

В 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
    }
6
ответ дан Ashok R 16 August 2018 в 00:25
поделиться

Еще один метод 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
ответ дан Aviel Gross 16 August 2018 в 00:25
поделиться

Для последних версий iOS просто добавьте UITraitCollection:

extension UITraitCollection {

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

, а затем в UIViewController просто проверьте:

if traitCollection.isIpad { ... }
0
ответ дан Bartłomiej Semańczyk 16 August 2018 в 00:25
поделиться
  • 1
    Это также работает, когда iPad-приложение находится в режиме разделения экрана? Тогда класс горизонтального размера будет компактным. – Oliver 27 June 2017 в 05:28

Вы также можете использовать это

#define IPAD UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad
...
if (IPAD) {
   // iPad
} else {
   // iPhone / iPod Touch
}
25
ответ дан Chilly 16 August 2018 в 00:25
поделиться
  • 1
    Ницца! Должен любить краткий синтаксис. – Clifton Labrum 8 January 2014 в 02:21

Я обнаружил, что некоторое решение не работает для меня в Simulator в Xcode. Вместо этого это работает:

ObjC

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

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

Swift

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

Также в «других примерах» в Xcode модель устройства возвращается как « iPad Simulator ', поэтому вышеупомянутая настройка должна разобраться в этом.

112
ответ дан Cœur 16 August 2018 в 00:25
поделиться
  • 1
    Возможно, Apple обновила симулятор, чтобы сказать что-то вроде «iPad simulator». или "iPad 2.1" или что-то ... если это так, вы можете использовать hasSuffix:@"iPad" вместо isEqualToString@"iPad" ... лучше всего зарегистрировать модель устройства, которую симулятор вернется и уйдет оттуда ... – Albert Renshaw 14 November 2012 в 23:31
  • 2
    * ^ Конечно, я имел в виду hasPrefix ... ха-ха – Albert Renshaw 26 June 2014 в 22:30
  • 3
    Я редактирую ссылку на ваш ответ в принятом ответе. (Таким образом, вы получаете кредит тоже). Хотя это объективный вопрос, многие люди, рассматривающие этот вопрос, приходят от Google и могут искать решение Swift! : D – Albert Renshaw 17 December 2014 в 06:49
  • 4
    Спасибо, @ Альберт Реншоу. Я тоже так думал. :) Кстати: я не думаю, что намерение вопроса состояло в том, чтобы спросить конкретно Objective-C, но для iOS (который был Obj-C в этот момент). По крайней мере, я бы ожидал найти ответ по этому вопросу и для Свифта. – Dschee 17 December 2014 в 16:43
  • 5
    Это не работает в симуляторе – sevensevens 26 December 2015 в 07:36
  • 6
    Привет @sevensevens, спасибо за ваши отзывы. Я только что пробовал это, и это работало для меня в XCode 7.2, ориентированном на iOS 9 в симуляторе. Какую версию XCode вы используете? Может быть, это не работает на старых XCodes? Документы говорят, что userInterfaceIdiom - «Доступно в iOS 3.2 и более поздних версиях». так что это не должно быть проблемой. – Dschee 26 December 2015 в 11:16
  • 7
    Или может быть, что вы используете приложение iPhone только на симуляторе iPad? В этом случае это объясняет путаницу, но, по-моему, это должно вести себя так же на реальных устройствах. Как @Yunus Nedim Mehel указывает в комментариях @Richards, что ситуация вернет .Phone вместо .Pad. – Dschee 26 December 2015 в 11:20

Много способов сделать это в 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 только в том случае, если приложение предназначено для iPad или Universal. Если это приложение для iPhone, запущенное на iPad, то этого не произойдет. Поэтому вы должны проверить модель. :

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

Этот фрагмент ниже не компилируется, если класс не наследует UIViewController, иначе он отлично работает. Несмотря на то, что UI_USER_INTERFACE_IDIOM() возвращает iPad только в том случае, если приложение предназначено для iPad или Universal. Если это приложение для iPhone, запущенное на iPad, то этого не произойдет. Поэтому вы должны проверить модель. :

class func isUserUsingAnIpad() -> Bool {
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.Pad) {
        return true
    } else {
        return false
    }
}
8
ответ дан King-Wizard 16 August 2018 в 00:25
поделиться
  • 1
    Я не думаю, что есть необходимость переписать старые ответы на вопросы с тегами Objective-C на быстрый. – Christian Schnorr 2 July 2015 в 14:07
  • 2
    Я определенно считаю, что мой ответ полезен, потому что во-первых, все ответы разбросаны по переполнению стека. Во-вторых, то, что работало со старыми версиями iOS, некорректно работает иногда с iOS 8 и выше. Поэтому я тестировал эти решения, и этот ответ может быть очень полезным. Поэтому я вообще не согласен с тобой. – King-Wizard 2 July 2015 в 18:02
  • 3
    Кроме того, синтаксис в Swift отличается. Поэтому всегда полезно, чтобы все сделали интеллектуальную копию копии ответа и поняли конкретные современные гайки и болты. – King-Wizard 2 July 2015 в 18:05
  • 4

UI_USER_INTERFACE_IDIOM () возвращает iPad только в том случае, если приложение предназначено для iPad или Universal. Если его приложение iPhone работает на iPad, это не будет. Поэтому вы должны проверить модель.

18
ответ дан malhal 16 August 2018 в 00:25
поделиться
  • 1
    Это была моя проблема. К сожалению, я просмотрел ваш ответ несколько часов назад. – thefoyer 23 May 2014 в 18:34

Будьте осторожны: если ваше приложение предназначено только для устройства iPhone, iPad, работающий с совместимым с iphone режимом, вернет false для следующего утверждения:

#define IPAD     UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad

Правильный способ обнаружения физического устройства iPad:

#define IS_IPAD_DEVICE      ([(NSString *)[UIDevice currentDevice].model hasPrefix:@"iPad"])
13
ответ дан peak 16 August 2018 в 00:25
поделиться
if(UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.pad)
 {
            print("This is iPad")
 }else if (UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.phone)
 {
            print("This is iPhone");
  }
0
ответ дан Rajesh Sharma 16 August 2018 в 00:25
поделиться

Это часть UIDevice с iOS 3.2, например ::

[UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad
33
ответ дан Richard 16 August 2018 в 00:25
поделиться
  • 1
    Идиома обычно лучше, но если вы используете iphone-приложение на iPad, это приведет к возврату UIUserInterfaceIdiomPhone. – Yunus Nedim Mehel 18 December 2013 в 19:05

Многие ответы хороши, но я использую это как в быстрых 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

}

1
ответ дан Rohit Sisodia 16 August 2018 в 00:25
поделиться
  • 1
    Зачем беспокоиться о структуре App, если вы можете сделать то же самое с расширением UIDevice? – Cœur 6 February 2018 в 05:19

Почему так сложно? Вот как я это делаю ...

Swift 4:

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

Таким образом вы можете просто сказать if iPad {}

0
ответ дан The Ruffus 16 August 2018 в 00:25
поделиться