UINavigationBar
не раскрывает свою внутреннюю иерархию представлений. Нет поддерживаемого способа получить ссылку на UILabel
, отображающий заголовок.
Вы можете копаться в его иерархии представлений «вручную» (путем поиска по его subviews
), но это может перестать работать в будущем выпуске iOS, поскольку иерархия представлений является частной.
Одним из обходных путей является создание UILabel
и установка его в качестве navigationItem.titleView
вашего контроллера представления. Вам решать, чтобы соответствовать стилю ярлыка по умолчанию, который может меняться в разных версиях iOS.
Тем не менее, это довольно легко настроить:
override func didMove(toParentViewController parent: UIViewController?) {
super.didMove(toParentViewController: parent)
if parent != nil && self.navigationItem.titleView == nil {
initNavigationItemTitleView()
}
}
private func initNavigationItemTitleView() {
let titleView = UILabel()
titleView.text = "Hello World"
titleView.font = UIFont(name: "HelveticaNeue-Medium", size: 17)
let width = titleView.sizeThatFits(CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude)).width
titleView.frame = CGRect(origin:CGPoint.zero, size:CGSize(width: width, height: 500))
self.navigationItem.titleView = titleView
let recognizer = UITapGestureRecognizer(target: self, action: #selector(YourViewController.titleWasTapped))
titleView.userInteractionEnabled = true
titleView.addGestureRecognizer(recognizer)
}
@objc private func titleWasTapped() {
NSLog("Hello, titleWasTapped!")
}
Я устанавливаю размер метки на ее естественную ширину (используя sizeThatFits:
), но я устанавливаю ее высоту на 500. Панель навигации сохранит ширину, но уменьшит высоту до собственной высоты панели. Это максимизирует область, доступную для касания (поскольку естественная высота метки может составлять всего около 22 пунктов, а высота полосы составляет 44 пункта).
person
rob mayoff
schedule
09.10.2014