Я знаю, что наличие контроллера more view (панель навигации) смещает UIView по высоте. Я также знаю, что эта высота = 44 пикселя. Я также обнаружил, что это нажатие поддерживает [self.view].frame.origin.y = 0
.
Итак, как мне определить высоту этой панели навигации, кроме как просто установить ее на константу?
Или, в более короткой версии, как определить, что мой UIView отображается с панелью навигации вверху?
Лампочка начала гореть. К сожалению, я не нашел единого способа исправить проблему, как описано ниже.
Я считаю, что вся моя проблема связана с автоизменением размеров маски. И причина, по которой я пришел к выводу, в том, что существуют те же симптомы, с UIWebView или без него. И этот симптом в том, что для портрета все идеально. Для ландшафта самый нижний элемент UIButton появляется за TabBar.
Например, на одном UIView у меня сверху вниз:
UIView - обе пружины установлены (случай по умолчанию) и без подкосов
UIScrollView - если я установил две пружины и очистил все остальное (например, UIView), то UIButton вторгнется в объект, расположенный непосредственно над ним. Если я все очищу, тогда UIButton в порядке, но материал на самом верху скрывается за StatusBar. Настройка только верхней стойки, UIButton появляется за панелью вкладок.
UILabel и UIImage next по вертикали - набор верхних стоек, гибкость везде
Чтобы завершить картину для тех немногих, у кого есть UIWebView:
UIWebView - Стойки: сверху, слева, справа Пружины: обе
UIButton - ничего не задано, т.е. гибкий везде
Хотя моя лампочка тусклая, похоже, есть надежда.
Пожалуйста, терпите меня, потому что мне нужно больше места, чем предусмотрено для короткого комментария.
Спасибо за попытку понять, что я на самом деле ловлю ... итак.
1) Каждый UIViewController (приложение TabBar) имеет UIImage, некоторый текст и все, что находится сверху. Еще один общий знаменатель - UIButton внизу. На некоторых UIViewControllers у меня есть UIWebView над UIButton.
Итак, UIImage, текст и т. Д. UIWebView (НЕКОТОРЫЕ) UIButton
Все вышеперечисленное окружает UIScrollView.
2) Для тех, у кого есть UIWebView, его autoresizingMask выглядит так:
—
|
—
^
|
|
| - | ← ---- → | - | | | V Маска UIButton ничего не настроена, т.е. гибкая везде
В моем -viewDidLoad я вызываю свой -repositionSubViews, в котором я делаю следующее:
Если UIWebView отсутствует, я ничего не делаю, кроме центрирования UIButton, который я разместил с IB.
Если у меня есть UIWebView, я определяю его * content * Height и устанавливаю его фрейм так, чтобы он заключал все содержимое.
UIScrollView *scrollViewInsideWebView = [[webView_ subviews] lastObject];
webViewContentHeight = scrollViewInsideWebView.contentSize.height;
[webView_ setFrame:CGRectMake(webViewOriginX, webViewOriginY,
sameWholeViewScrollerWidth, webViewContentHeight)]
Как только я это сделаю, я программно нажимаю UIButton вниз, чтобы он оказался под UIWebView.
Все работает, пока я не поверну с портретной на альбомную.
Я вызываю свой -repositionSubViews в моем -didRotateFromInterfaceOrientation.
Почему высота содержимого моего UIWebView не изменяется при вращении ?.
При переходе от книжной к альбомной ширина содержимого должна увеличиваться, а высота - уменьшаться. Визуально он работает так, как должен, но не в соответствии с моим NSLog.
В любом случае, с UIWebView или без него, кнопка, о которой я говорил, перемещается ниже TabBar в ландшафтном режиме, но не прокручивается вверх, чтобы ее можно было увидеть. Я вижу его за TabBar, когда я «энергично» прокручиваю, но затем он «откатывается» за TabBar.
В итоге, это последняя причина, по которой я спросил о высоте TabBar и NavigationBar, потому что TabBar располагается в нижней части UIView, а NavigationBar толкает UIView вниз.
Теперь я собираюсь добавить сюда один-два комментария, потому что раньше они не имели бы смысла.
Без UIWebView я оставляю все, как его видит IB.
С помощью UIWebView я увеличиваю frame.height UIWebView до его contentHeight, а также увеличиваю высоту окружающего UIScrollView, который окружает все под-представления.
Ну вот и все.
В iPhone-X высота верхней панели (панель навигации + строка состояния) изменена (увеличена).
Попробуйте это, если вам нужна точная высота верхней панели (как панель навигации, так и строка состояния):
ОБНОВИТЬ
iOS 13
Поскольку это
statusBarFrame
было устаревшим,iOS13
вы можете использовать это:Objective-C
Swift 4
Для удобства попробуйте это расширение UIViewController
Swift 3
источник
Быстрая версия:
источник
Вы пробовали это?
источник
Поддержка iOS 13 и ниже:
источник
Итак, все, что нам действительно нужно, это
источник
В моем приложении есть несколько представлений, для которых требуется настраиваемая панель навигации в пользовательском интерфейсе для внешнего вида, но без контроллера навигации. И приложение должно поддерживать версию iOS до iOS 11, поэтому удобное руководство по макету безопасной области использовать нельзя, и мне приходится программно настраивать положение и высоту панели навигации.
Я прикрепил панель навигации к ее супервизору напрямую, пропустив руководство по компоновке безопасной области, как упомянуто выше. И высоту строки состояния можно легко получить из UIApplication, но высота панели навигации по умолчанию действительно доставляет боль ...
Это поразило меня почти на половину ночи, с множеством поисков и проверок, пока я, наконец, не получил подсказку из другого сообщения (хотя мне не работало), что вы действительно можете получить высоту из UIView.sizeThatFits (), например :
Наконец, идеальная панель навигации выглядит точно так же, как и встроенная!
источник
Если вы хотите получить
navigationBar
только высоту, это просто:Однако, если вам нужна высота верхней отметки iPhone, вам не нужно получать
navigationBar
высоту и прибавлять к нейstatusBar
высоту, вы можете просто позвонитьsafeAreaInsets
, почему существует.источник
Лампочка начала гореть. К сожалению, я не нашел единого способа исправить проблему, как описано ниже.
Я считаю, что вся моя проблема связана с автоизменением размеров маски. И причина, по которой я пришел к выводу, в том, что существуют те же симптомы, с UIWebView или без него. И этот симптом в том, что для портрета все идеально. Для ландшафта самый нижний элемент UIButton появляется за TabBar.
Например, на одном UIView у меня сверху вниз:
UIView - обе пружины установлены (случай по умолчанию) и без подкосов
UIScrollView - если я установил две пружины и очистил все остальное (например, UIView), то UIButton вторгнется в объект, расположенный непосредственно над ним. Если я все очищу, тогда UIButton в порядке, но материал на самом верху скрывается за StatusBar. Настройка только верхней стойки, UIButton появляется за панелью вкладок.
UILabel и UIImage next по вертикали - набор верхних стоек , гибкость везде
Чтобы завершить картину для тех немногих, у кого есть UIWebView:
UIWebView - Стойки: сверху, слева, справа Пружины: обе
UIButton - ничего не задано, т.е. гибкий везде
Хотя моя лампочка тусклая, похоже, есть надежда.
источник
Вот начало моего ответа на ваше обновление:
Может быть, из-за того, что в вашем автоматическом изменении размера нет маски автоизменения размеров для всех направлений?
Еще одно предложение, прежде чем я вернусь к этому, не могли бы вы использовать панель инструментов для своих нужд. Это немного проще, всегда будет внизу, автоповорот / положение. Вы можете скрыть / показать его по желанию и т.д. Примерно так: http://cdn.artoftheiphone.com/wp-content/uploads/2009/01/yellow-pages-iphone-app-2.jpg
Возможно, вы смотрели на этот вариант, но просто выбросили его.
Другая идея: не могли бы вы определить, с какой ориентации вы поворачиваете, и просто программно разместите кнопку, чтобы настроить панель вкладок. (Это возможно с кодом)
источник
Я использовал:
Отлично работает, если вы хотите получить высоту панели навигации И ее начало Y.
источник
Swift 5
Если вы хотите рассмотреть также безопасную область:
источник
Удобное расширение Swift 4, если оно кому-то поможет. Работает, даже если текущий контроллер представления не отображает панель навигации.
Использование:
источник