Получить верхнюю и нижнюю высоты вставки в безопасную область
На новом iPhone X, какой был бы самый правильный способ получить как верхнюю, так и нижнюю высоту для небезопасных областей?
Ответы
Ответ 1
Попробуй это:
В Цель C
if (@available(iOS 11.0, *)) {
UIWindow *window = UIApplication.sharedApplication.keyWindow;
CGFloat topPadding = window.safeAreaInsets.top;
CGFloat bottomPadding = window.safeAreaInsets.bottom;
}
В Swift
if #available(iOS 11.0, *) {
let window = UIApplication.shared.keyWindow
let topPadding = window?.safeAreaInsets.top
let bottomPadding = window?.safeAreaInsets.bottom
}
Ответ 2
Чтобы получить высоту между направляющими макетов, которые вы просто делаете
let guide = view.safeAreaLayoutGuide
let height = guide.layoutFrame.size.height
Таким образом, full frame height = 812.0
, safe area height = 734.0
Ниже приведен пример, где зеленый вид имеет рамку guide.layoutFrame
Ответ 3
Swift 4
Прикрепить представление к привязке безопасной области с помощью ограничений можно в любой точке жизненного цикла контроллера представления, поскольку ограничения обрабатываются API автоматического размещения за кулисами. Однако для доступа к значениям этих безопасных областей для определения их высоты необходимо подождать до более позднего периода в жизненном цикле контроллера представления, в идеале viewDidLayoutSubviews()
.
Это подключается к любому контроллеру представления:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
var topSafeArea: CGFloat
var bottomSafeArea: CGFloat
if #available(iOS 11.0, *) {
topSafeArea = view.safeAreaInsets.top
bottomSafeArea = view.safeAreaInsets.bottom
} else {
topSafeArea = topLayoutGuide.length
bottomSafeArea = bottomLayoutGuide.length
}
// safe area values are now available to use
}
Я предпочитаю этот метод, чтобы вывести его из окна, потому что именно так Apple разработала API для использования. Не ссылайтесь на посторонние объекты, такие как окно, когда все уже находится в контроллере вида. А с помощью viewDidLayoutSubviews()
значения безопасной области обновляются во время изменений ориентации, viewDidLayoutSubviews()
состояния двойной высоты и всех других мутаций в представлении и его безопасных областях.
Ответ 4
Ни один из других ответов здесь не работал для меня, но это сработало.
var topSafeAreaHeight: CGFloat = 0
var bottomSafeAreaHeight: CGFloat = 0
if #available(iOS 11.0, *) {
let window = UIApplication.shared.windows[0]
let safeFrame = window.safeAreaLayoutGuide.layoutFrame
topSafeAreaHeight = safeFrame.minY
bottomSafeAreaHeight = window.frame.maxY - safeFrame.maxY
}
Ответ 5
Я работаю со средами CocoaPods и в случае, если UIApplication.shared
недоступен, тогда я использую safeAreaInsets
в window
просмотра:
if #available(iOS 11.0, *) {
let insets = view.window?.safeAreaInsets
let top = insets.top
let bottom = insets.bottom
}
Ответ 6
Objective-C У кого была проблема, когда keyWindow равно nil. Просто поместите код выше в viewDidAppear (не в viewDidLoad)
Ответ 7
safeAreaLayoutGuide
Когда вид отображается на экране, это руководство отражает часть вида, которая не покрыта панелями навигации, панелями вкладок, панелями инструментов и другими видами предков. (В tvOS безопасная область отражает область, не покрытую рамкой экрана.) Если вид в настоящее время не установлен в иерархии видов или еще не виден на экране, края направляющих макета равны краям вида.
Затем, чтобы получить высоту красной стрелки на скриншоте, это:
self.safeAreaLayoutGuide.layoutFrame.size.height
Ответ 8
UIWindow *window = [[[UIApplication sharedApplication] delegate] window];
CGFloat fBottomPadding = window.safeAreaInsets.bottom;