Проблема с нажатием кнопок панели, выровненных по вертикали, за пределами панели навигации

#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)
 

Вот как это выглядит:
Изображение 1

Довольно хорошо, верно?

Ну, проблема в том, что кнопка уведомления не получает кликов, но кнопка настроек есть. Я предполагаю, что кнопка уведомления находится за пределами панели навигации, как показано на этом рисунке ( UINavigationBar синяя, моя rightBarButtonCustomView красная).: Изображение 2

Я пытался использовать ограничения, увеличить высоту панели навигации, но, казалось, ничего не получалось.

Любая помощь будет признательна

Спасибо!

Комментарии:

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. К сожалению, тот же результат 🙁 Я могу прикрепить видео результата, если хотите. Позвольте мне попробовать поместить ваш код в другую функцию представления