У меня есть 5 вкладок в UITabBarController, и каждая из них встроена в UINavigationController. Я хотел бы установить высоту этой вкладки на 8% экрана, но я не могу установить ограничения для StoryBoard, также, если я попытаюсь установить его из кода, он станет черным и сломает элементы управления пользовательского интерфейса. Код для моего UINavigationController таков:
class NavBarController: UINavigationController {
override func viewDidLayoutSubviews() {
self.navigationBar.topItem?.titleView = UIImageView(image: UIImage(named: "image"))
self.navigationBar.topItem?.titleView?.contentMode = .scaleAspectFit
let gradient = CAGradientLayer()
var bounds = self.navigationBar.bounds
bounds.size.height += self.view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
bounds.origin.y -= self.view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
gradient.frame = bounds
gradient.colors = [UIColor.black, UIColor.white]
gradient.locations = [0.0, 1.0]
self.navigationBar.setBackgroundImage(image(fromLayer: gradient), for: .default)
}
func image(fromLayer layer: CALayer) -> UIImage {
UIGraphicsBeginImageContext(layer.frame.size)
layer.render(in: UIGraphicsGetCurrentContext()!)
let outputImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return outputImage!
}
}
Я пытался установить:
self.navigationBar.frame.size.height = (self.view.superview?.frame.height)! * 0.08
self.navigationBar.layoutIfNeeded()
в начале viewDidLayoutSubviews, но это не работает, а также нарушает градиентный фон. Кто-нибудь может мне помочь? Идеальным решением было бы использование раскадровки, но я не могу просто установить ограничение высоты UINavigationItem на его высоту просмотра.
Вы пытались выполнить этот код, переопределив
layout()
илиupdateConstraints()
? Я считаю, чтоviewDidLayoutSubviews()
слишком поздно в цикле рендеринга. Вы захотите создать подклассUINavigationBar
и выполнить переопределение в своем пользовательском подклассе.@user1922718 user1922718 нет, я не пробовал, потому что у меня были некоторые проблемы с градиентом, но я попробую. Спасибо. Как получить доступ к высоте супервизора? self.navigationController.view.superview...?
Вызов
superview
для любого представления даст вам его родительское представление, если представление находится в иерархии представлений. Таким образом, вы можете получить высоту супервизора, позвонив по телефонуview.superview.frame.height
@user1922718 user1922718 Я пробовал по-разному, переопределяя layoutSubviews(), updateConstraints() и т. д., а также снова пробовал в контроллере. Ничего, я не могу установить эту чертову высоту полосы.
Еще одна вещь, которую вы можете попробовать, это создать подкласс
UINavigationBar
и написать наблюдательdidSet
для переменнойframe
. Затем установите точку останова в отладчике и отмечайте каждый раз, когда эта переменная изменяется и в какой момент цикла рендеринга. Это даст вам подсказки относительно того, когда вам нужно установить высоту полосы.