Идентифицируйте iPhone с помощью Notch программно - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь программно идентифицировать айфоны с надрезом.Мне известен метод screen.size, но когда у вас есть универсальное приложение, поддерживающее все ориентации интерфейса, оно становится беспорядочным (считая все возможные варианты).Поэтому я ищу более простой и элегантный способ обнаружения новых моделей iPhone X.

Я наткнулся на метод онлайн, который должен работать.В нем вы измеряете нижнюю вставку безопасной области, и если она не равна нулю, у вас есть модель iPhone X.Это имеет смысл в теории, поскольку безопасная область не достигает нижней части экрана на телефонах iPhone X, а на всех других устройствах.Я делаю проверку следующим образом:

if (@available( iOS 11.0, * )) {
    if ([[[UIApplication sharedApplication] keyWindow] safeAreaInsets].bottom > 0) {
        // iPhone with notch
    }
} else {
    // Regular iPhone
}

Это, однако, не работает.Может кто-то указать на мою ошибку в реализации или подтвердить, если этот метод является даже жизнеспособным?

1 Ответ

0 голосов
/ 20 апреля 2019

Мне пришлось немного покопаться, но я нашел ответ (я хотел бы выкрикнуть user6788419, чей правильный ответ был глубоко занят в другом потоке).

Прежде всего, приведенный выше кодправильный.Проверка того, что нижняя вставка безопасной области больше нуля, точно идентифицирует айфоны с надрезом (на момент написания статьи).Итак, это правильно:

if (@available( iOS 11.0, * )) {
    if ([[[UIApplication sharedApplication] keyWindow] safeAreaInsets].bottom > 0) {
        // iPhone with notch
    }
}

Тем не менее, важно, куда вы поместили вышеприведенный оператор в свой код, потому что UIWindow недоступно до завершения первого цикла выполнения.Это означает, что если вы проверите метку в вашем viewDidLoad или до того, как он завершится (например, в вашем init), нижняя вставка всегда будет равна нулю.

Если вам, как и мне, нужна эта проверка для настройки вашегоВ главном представлении вы можете просто переместить все свои настройки в отдельную функцию (например, postViewDidLoad) и вызвать ее, как только viewDidLoad завершит:

[self performSelector:@selector(postViewDidLoad) withObject:nil afterDelay:0.0f];

Или, альтернативно, вы можете заключить ее:

...