#ios #swift #uinavigationbar #uibarbuttonitem #nslayoutconstraint
Вопрос:
Я пытаюсь выровнять две UIBarButtonItem
буквы s по вертикали с правой стороны от моей UINavigationBar
. Я использую пользовательский вид и выравниваю в нем две кнопки.
Вот код:
let rightBarButtonCustomView = UIView(frame: CGRect(x: 0, y: 0, width: 40, height: 90))
let settingsButton = UIButton(frame: CGRect(x: 0, y: 0, width: 40, height: 40))
settingsButton.setImage(UIImage(systemName: "gearshape.fill"), for: .normal)
settingsButton.backgroundColor = preferredBackgroundColor
settingsButton.tintColor = .accentColor
settingsButton.addTarget(self, action: #selector(openSettingsScreen), for: .touchUpInside)
settingsButton.layer.cornerRadius = settingsButton.frame.size.height / 2
settingsButton.layer.borderWidth = 1
settingsButton.layer.borderColor = UIColor.label.cgColor
settingsButton.layer.masksToBounds = true
rightBarButtonCustomView.addSubview(settingsButton)
//NotificationButton
let notificationsButton = UIButton(frame: CGRect(x: 0, y: 50, width: 40, height: 40))
notificationsButton.setImage(UIImage(systemName: "bell.fill"), for: .normal)
notificationsButton.backgroundColor = preferredBackgroundColor
notificationsButton.tintColor = .accentColor
notificationsButton.addTarget(self, action: #selector(openNotificationScreen), for: .touchUpInside)
notificationsButton.layer.cornerRadius = notificationsButton.frame.size.height / 2
notificationsButton.layer.borderWidth = 1
notificationsButton.layer.borderColor = UIColor.label.cgColor
notificationsButton.layer.masksToBounds = true
rightBarButtonCustomView.addSubview(notificationsButton)
self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: rightBarButtonCustomView)
Довольно хорошо, верно?
Ну, проблема в том, что кнопка уведомления не получает кликов, но кнопка настроек есть. Я предполагаю, что кнопка уведомления находится за пределами панели навигации, как показано на этом рисунке ( UINavigationBar
синяя, моя rightBarButtonCustomView
красная).:
Я пытался использовать ограничения, увеличить высоту панели навигации, но, казалось, ничего не получалось.
Любая помощь будет признательна
Спасибо!
Комментарии:
1. Судя по вашим изображениям, не похоже, что вы находитесь в стеке навигационного контроллера? Если это так, то вам было бы гораздо лучше не использовать a
UINavigationBar
. Если вы находитесь в стеке навигационного контроллера (то есть вы попадаете в этот контроллер просмотра, «нажимая» на него), покажите код, который вы используете для настройки внешнего вида панели навигации.
Ответ №1:
Приведенный ниже код хорошо работает для меня.
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
navigationBar.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: 200)
}
Комментарии:
1. Высота остается правильной менее секунды, затем сразу же возвращается в норму. Может быть, мне следует выполнить другую функцию просмотра? (т. Е. viewDidLoad() или viewDidAppear())
2. Привет @goatofanerd Вы тестируете его на реальном устройстве или на симуляторе??
3. Настоящее устройство! Будет ли это иметь значение?
4. Да, это так. ОС устройства тоже имеет значение. Пожалуйста, проверьте это на своем симуляторе.
5. К сожалению, тот же результат 🙁 Я могу прикрепить видео результата, если хотите. Позвольте мне попробовать поместить ваш код в другую функцию представления