Подтвердить что ты не робот

IOS11 настраивает высоту навигационной панели

Прежде всего, спасибо за то, что пришли сюда и помогли решить мою проблему. Спасибо!

В iOS11 beta6, sizeThatFits:, похоже, не работает в UINavigationBar. Я заметил, что структура UINavigationBar изменилась с помощью Reveal my app.

Я попытался изо всех сил изменить собственную высоту навигационной панели. Но это всегда должно быть 44, и оно работает до iOS11.

- (CGSize)sizeThatFits:(CGSize)size {
    CGSize newSize = CGSizeMake(self.frame.size.width, 64);
    return newSize;
}

enter image description here

Как ни странно, я просто регистрирую его фрейм в методе didMoveToSuperview, его высота равна 64, но я действительно вижу, что это 44 в Reveal и app.

Я понятия не имею об этом... Помогите мне, пожалуйста.. Спасибо.

Update:

Я обнаружил, что о моей настраиваемой панели навигации LayoutConstraints входит в консоль следующим образом:

"<NSAutoresizingMaskLayoutConstraint:0x604000495ae0 FDCustomNavigationBar:0x7fe2f01399d0.(null) == 42>",
"<NSAutoresizingMaskLayoutConstraint:0x604000495b30 FDCustomNavigationBar:0x7fe2f01399d0.height == 44>"`

Я даже не использую автомат в моей навигационной панели. Что с ним не так?

Обновление 8/28:

enter image description here

Я установил свой настраиваемый фрейм подкадров в панели навигации - layoutSubviews.

- (void)layoutSubviews {
    [super layoutSubviews];

    self.frame = CGRectMake(0, 0, CGRectGetWidth(self.frame), 64);

    for (UIView *view in self.subviews) {

        if([NSStringFromClass([view class]) containsString:@"Background"]) {
            view.frame = self.bounds;
        } else if ([NSStringFromClass([view class]) containsString:@"ContentView"]) {
            CGRect frame = view.frame;
            frame.origin.y = 20;
            frame.size.height = self.bounds.size.height - frame.origin.y;
            view.frame = frame;
        }
    }
}

но панель навигации будет отображать вид контроллера. Как я могу это исправить?

4b9b3361

Ответ 1

Так как iOS 11 UINavigationBar полностью поддерживает автоматический макет (именно по этой причине вы видите его ограничения). Я открыл радар для Apple, потому что я думал, что установка ограничения высоты для titleView соответствующим образом изменила бы высоту навигационной панели. Однако это то, на что ответил Apple:

Полная поддержка автоматического макета не означает, что ваше представление может влиять на другие аспекты макета панели навигации - в частности, панель навигации обеспечивает собственную высоту и не позволяет увидеть вид заголовка или другие пользовательские представления, превышающие высота навигационной панели. Мы продолжаем работать над этой проблемой и будем следить за вами снова.

На сегодняшний день радар все еще открыт.

Ответ 2

Здравствуйте, я просто испытал эту же проблему.

Теперь верхний макет руководства устарел на iOS 11. Вам нужно ссылаться на safeAreaLayoutGuide в ваших ограничениях.

Здесь пример в swift

    if #available(iOS 11, *) {
        let guide = self.view.safeAreaLayoutGuide.topAnchor
        let height = (self.navigationController?.navigationBar.frame.height)! - CGFloat(12)
        NSLayoutConstraint.activate([
        self.yourTableView.topAnchor.constraint(equalTo: guide, constant: height)
        ])
    }

Как вы можете видеть, ваш верхний якорь должен соответствовать верхнему якорю safeAreaLayoutGuide. В этом примере я использую высоту переменной для создания нового ограничения. Переменная высота содержит высоту навигационной строки минус константа.

Попробуйте изменить значение высоты.

Надеюсь, это поможет вам.