Авто-макет в представлении для заголовка панели навигации

У меня есть простой класс, который создает 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(), но пока безуспешно. Как разместить представление в качестве заголовка для панели навигации и элементы макета внутри этого представления?


person coco    schedule 03.01.2019    source источник
comment
Здравствуй! Вы пытались вызвать sizeToFit() после установки текста вашей метки? Это помогло мне, когда я попытался разместить метку на панели навигации.   -  person joliejuly    schedule 03.01.2019
comment
Да @joliejuly, я поставил theLabel.sizeToFit() сразу после установки текста; это не имело значения - все еще в верхнем левом углу.   -  person coco    schedule 03.01.2019
comment
какая авария..........   -  person Sh_Khan    schedule 03.01.2019
comment
@Sh_Khan: libc++abi.dylib: terminating with uncaught exception of type NSException (сигнал SIGABRT)   -  person coco    schedule 03.01.2019
comment
пожалуйста, временно поделитесь всем журналом консоли   -  person Sh_Khan    schedule 03.01.2019
comment
также, в какой момент вы вызываете NSLayoutConstraint.activate для метки?   -  person joliejuly    schedule 03.01.2019
comment
@joliejuly: я вызываю NSLayoutConstraint.activate сразу после theLabel.translatesAutoresizingMaskIntoConstraints = false в приведенном выше коде.   -  person coco    schedule 03.01.2019
comment
это проблема, вам нужно установить ограничения после addSubview   -  person Sh_Khan    schedule 03.01.2019
comment
@Sh_Khan: других сообщений в журнале консоли нет. Я останавливаю выполнение программы непосредственно перед строкой NSLayoutConstraint.activate и вижу, что кадр для self (UIView) равен (0, 0, 0, 0)   -  person coco    schedule 03.01.2019
comment
‹вздох› Да, вы оба правы, @joliejuly и @Sh_Khan. Интересно, что UIView.backgroundcolor при этом теряется, но это незначительная проблема.   -  person coco    schedule 03.01.2019


Ответы (1)


Я предполагаю, что это ошибка заказа

self.addSubview(theLabel) // first
NSLayoutConstraint.activate([  // then second
  theLabel.centerXAnchor.constraint(equalTo: self.centerXAnchor),
  theLabel.centerYAnchor.constraint(equalTo: self.centerYAnchor)
])
person Sh_Khan    schedule 03.01.2019