У меня есть простой класс, который создает UIView
, содержащий метку. Я хочу использовать этот вид как центральную часть UINavigationBar
с двумя кнопками по бокам. Приведенный ниже код хорошо работает без добавления метки:
class myView : UIView {
override init(frame: CGRect) {
super.init(frame: frame)
self.backgroundColor = .green
}
}
Я называю класс так:
let avatar = UIBarButtonItem(image: avatarImage, ...)
let otherButton = UIBarButtonItem(image: otherImage, ...)
navigationItem.leftBarButtonItems = [avatar]
navigationItem.rightBarButtonItems = [otherButton]
let headerTitle = myView(frame: .zero)
headerTitle.translatesAutoresizingMaskIntoConstraints = false
navigationItem.titleView = headerTitleView
Но если я добавлю метку внутри UIView:
class myView : UIView {
override init(frame: CGRect) {
super.init(frame: frame)
self.backgroundColor = .green
let theLabel = UILabel(frame: .zero)
theLabel.text = "The Title"
theLabel.textAlignment = .center
theLabel.translatesAutoresizingMaskIntoConstraints = false
self.addSubview(theLabel!)
}
}
.. Я вижу метку, но она застряла в крайнем левом углу экрана. Если я попытаюсь добавить ограничения к метке, что-то вроде этого:
NSLayoutConstraint.activate([
theLabel.centerXAnchor.constraint(equalTo: self.centerXAnchor),
theLabel.centerYAnchor.constraint(equalTo: self.centerYAnchor)
])
.. происходит сбой, так как размер self (UIView) по-прежнему равен .zero.
Я пробовал различные комбинации layoutIfNeeded()
и sizeToFit()
, но пока безуспешно. Как разместить представление в качестве заголовка для панели навигации и элементы макета внутри этого представления?
theLabel.sizeToFit()
сразу после установки текста; это не имело значения - все еще в верхнем левом углу. - person coco   schedule 03.01.2019libc++abi.dylib: terminating with uncaught exception of type NSException
(сигнал SIGABRT) - person coco   schedule 03.01.2019NSLayoutConstraint.activate
сразу послеtheLabel.translatesAutoresizingMaskIntoConstraints = false
в приведенном выше коде. - person coco   schedule 03.01.2019NSLayoutConstraint.activate
и вижу, что кадр дляself
(UIView) равен (0, 0, 0, 0) - person coco   schedule 03.01.2019UIView.backgroundcolor
при этом теряется, но это незначительная проблема. - person coco   schedule 03.01.2019