Как я могу определить, является ли мое устройство iPhoneX в Swift 4?

Я уверен, что есть лучший, более правильный способ сделать это. Но прямо сейчас я использую UIScreen.main.bounds, чтобы определить, имею ли я дело с iPhone X (высотой 812) или нет. Кстати, это конкретное приложение работает только в альбомной ориентации. Итак, вот что у меня есть в этой функции, где я создаю слайды для просмотра слайдов:

func setupSlideViews(slideView: [SlideView]) {
    let screenSize = UIScreen.main.bounds

    var frame: CGRect!
    if screenSize.width == 812 {
        frame = scrollView.frame
    } else {
        frame = view.frame
    }
    scrollView.frame = frame
    scrollView.contentSize = CGSize(width: frame.width * CGFloat(slideViews.count), height: frame.height)

    for (i, slideView) in slideViews.enumerated() {
        slideView.frame = CGRect(x: frame.width * CGFloat(i), y: 0, width: frame.width, height: frame.height)
        scrollView.addSubview(slideView)
    }
}

Но как проверить модель?


person user1269290    schedule 03.10.2017    source источник
comment
взгляните, пожалуйста, stackoverflow.com/a/52821290/3472073   -  person ale_stro    schedule 12.11.2018


Ответы (1)


Если вам нужно определить, является ли устройство iPhoneX, не используйте bounds, это зависит от ориентации устройства. Поэтому, если пользователь открывает ваше приложение в портретном режиме, оно не работает. Вы можете использовать свойство устройства nativeBounds, которое не меняется при ротации.

В iOS 8 и более поздних версиях свойство границ экрана учитывает ориентацию интерфейса экрана. Такое поведение означает, что границы устройства в портретной ориентации могут не совпадать с границами устройства в альбомной ориентации. Приложения, которые полагаются на размеры экрана, могут использовать объект в свойстве fixedCoordinateSpace в качестве фиксированной точки отсчета для любых вычислений, которые они должны сделать. (До iOS 8 прямоугольник границ экрана всегда отражал размеры экрана относительно вертикальной ориентации. При повороте устройства в альбомную или перевернутую ориентацию границы не менялись.)

extension UIDevice {
    var iPhoneX: Bool {
        return UIScreen.main.nativeBounds.height == 2436
    }
}

использование

if UIDevice.current.iPhoneX { 
    print("This device is a iPhoneX")
}
person Leo Dabus    schedule 03.10.2017
comment
просто и эффективно! спасибо - person tylerSF; 06.01.2018
comment
@tylerSF добро пожаловать - person Leo Dabus; 06.01.2018
comment
см. stackoverflow.com/a/52821290/3472073 - person ale_stro; 14.01.2020