Безопасная зона и панель навигации
Я пытаюсь добавить панель навигации в xib, но панель навигации не заполняется до верха, она оставляет пространство над ней, где находится выемка камеры. Смотрите скриншот ниже:
Вот мои ограничения для панели навигации:
Я также попытался установить верхнее ограничение для панели навигации на Superview. Это результат этого:
Я не могу поверить, что это так сложно. Что мне здесь не хватает?
4 ответа
- У вас должен быть @IBOutlet вашей панели навигации (или ссылка, если панель навигации сделана программно). Кроме того, оставьте верхнее ограничение панели Safe area.
- Сделайте свой ViewController соответствующим
UINavigationBarDelegate
и установите делегата панели навигации (navigationBar.delegate = self
) - Реализуйте эту функцию и верните.topAttached:
func position(for bar: UIBarPositioning) -> UIBarPosition { return .topAttached }
Вы почти никогда не хотите добавлять UINavigationBar
непосредственно к контроллеру представления view
Скорее вы хотите встроить свой контроллер представления в UINavigationController
, Если вы используете раскадровки, вы можете сделать это, выбрав контроллер представления, щелкнув меню "Редактор" -> "Встроить" -> "Контроллер навигации".
Если раскадровки не используются, вы можете создать контроллер представления и установить его в качестве корневого контроллера представления UINavigationController
, Затем представьте контроллер навигации или вставьте этот контроллер навигации в контроллер вкладок или разделенный контроллер.
let mySpecialViewController = MySpecialViewController()
let navigationController = UINavigationController(rootViewController: mySpecialViewController)
present(navigationController, animated: true)
Этот код выше должен вызываться изнутри UIViewController
подкласс.
Если вы делаете это из своего делегата приложения для настройки начального контроллера представления вашего приложения, вы можете сделать это следующим образом:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
let mySpecialViewController = MySpecialViewController()
let navigationController = UINavigationController(rootViewController: mySpecialViewController)
window?.rootViewController = navigationController
window?.makeKeyAndVisible()
return true
}
Была такая же проблема, и я смог найти решение. Что вам нужно сделать, так это установить делегата, реализовать positionForBar: в делегате, возвращающем UIBarPositionTopAttached
- (UIBarPosition)positionForBar:(id <UIBarPositioning>)bar
{
return UIBarPositionTopAttached;
}
Пытаетесь использовать навигационную панель не в навигационном контроллере?
Изображение моего расширенного навигационного хака (выделено синим цветом для видимости)
После создания моей панели навигации сообщений с этим:
let navBar = UINavigationBar(frame: CGRect(x: 0, y: 44.0, width: UIScreen.main.bounds.width, height: 55.0))
self.view.addSubview(navBar)
navBar.items?.append(UINavigationItem(title: "title"))
if #available(iOS 13.0, *) {
let navBarAppearance = UINavigationBarAppearance()
navBarAppearance.configureWithOpaqueBackground()
navBarAppearance.backgroundColor = UIColor.white
navBar.standardAppearance = navBarAppearance
navBar.scrollEdgeAppearance = navBarAppearance
} else {
//ConvoViewController.edgesForExtendedLayout = []
}
Я сталкивался с проблемой, когда пользователь мог прокручивать вверх и видеть сообщения над панелью навигации, наложенные на сигнал времени/батареи/Wi-Fi, что делало очень плохой пользовательский интерфейс.
Чтобы решить эту проблему, я создал UITextView для подвида так же, как у меня была панель навигации, я установил синий фон, чтобы вы могли его видеть, но вы можете изменить его на любой цвет.
let navBar = UINavigationBar(frame: CGRect(x: 0, y: 44.0, width: UIScreen.main.bounds.width, height: 55.0))
var textView = UITextView(frame: CGRect(x: 0, y: 0.0, width: UIScreen.main.bounds.width, height: 55.0))
textView.backgroundColor = UIColor.blue
self.view.addSubview(textView)
self.view.addSubview(navBar)
navBar.items?.append(UINavigationItem(title: "title"))
if #available(iOS 13.0, *) {
let navBarAppearance = UINavigationBarAppearance()
navBarAppearance.configureWithOpaqueBackground()
navBarAppearance.backgroundColor = UIColor.white
navBar.standardAppearance = navBarAppearance
navBar.scrollEdgeAppearance = navBarAppearance
} else {
//ConvoViewController.edgesForExtendedLayout = []
}