Я включил большие заголовки для панели навигации с помощью:

navigationController?.navigationBar.prefersLargeTitles = true

Таким образом, навигационная панель начинается с увеличенной высоты и уменьшается по мере прокрутки вниз.

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

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

guard let height = navigationController?.navigationBar.frame.height else { return }
print("Navigation height: \(height)")

Я вызываю это внутри scrollViewDidScroll, и при прокрутке кажется, что развернутая высота составляет около 96, а уменьшенная - около 44. Однако я не хочу жестко кодировать значения.

iPhone 12

Расширенные (96,33) Растянутая (44)
введите описание изображения здесь введите описание изображения здесь

iPhone 8

Расширенная (96,5) Shrunk (44)
введите описание изображения здесь введите описание изображения здесь

Я также могу получить эти значения только тогда, когда пользователь физически прокручивает страницу вверх и вниз, что не будет работать на производстве. И даже если я заставлю пользователя прокрутить страницу, все равно будет слишком поздно, потому что мне нужно знать обе высоты заранее, чтобы я мог вставить свое изменяющее размер вложенное представление.

Я хочу получить эти значения, но без жесткого кодирования или прокрутки

Есть ли способ получить высоту уменьшенной и увеличенной навигационной панели?

aheze

Ответов: 1

Ответы (1)

Используя следующее расширение, вы можете получить дополнительную высоту

extension UINavigationBar
{
    var largeTitleHeight: CGFloat {
        let maxSize = self.subviews
            .filter { $0.frame.origin.y > 0 }
            .max { $0.frame.origin.y < $1.frame.origin.y }
            .map { $0.frame.size }
        return maxSize?.height ?? 0
    }
} 

Как я уже говорил, вы можете увеличить высоту, следуя следующим рекомендациям

guard let height = navigationController?.navigationBar.frame.maxY else { return }
print("Navigation height: \(height)")

let window = UIApplication.shared.keyWindow
let topPadding = window?.safeAreaInsets.top

let extendedHeight = height - topPadding

Вы можете получить уменьшенную высоту, вычтя разницу из увеличенной высоты

guard let difference = navigationController?.navigationBar.lagreTitleHeight else {return}
let shrunkHeight = extendedHeight - difference 
Решение

2022 WebDevInsider