Переместите в y-направлении пользовательскую панель навигации. TitleView - PullRequest
0 голосов
/ 17 января 2020

Использование Swift5.1.3, XCode11.3, iOS13.3,

Я пытаюсь изменить положение заголовка пользовательского навигационного бара.

Создание пользовательского представления и добавление его в мой навигационный бар работает нормально. (см. код ниже)

Вот пример: пожалуйста, рассмотрите только навигационную панель DarkGray сверху с меткой имени и круглым желтым изображением. Метка и изображение должны быть перемещены в направлении y!

enter image description here

Пример слева, я успешно запускаю. Пример справа я пытаюсь достичь. Но пока без удачи.

Есть одна недостающая вещь, с которой я борюсь с 4 часами.

Как мне отрегулировать y-позицию (или смещение константы .topAnchor) пользовательской панели навигации titleView ???

Сообщение cra sh гласит:

'Unable to activate constraint with anchors
<NSLayoutYAxisAnchor:0x6000033ac900 "UIStackView:0x7fdcced39ea0.top"> and
<NSLayoutYAxisAnchor:0x6000033644c0 "UIView:0x7fdcd412ba20.top"> because they
have no common ancestor.  Does the constraint or its anchors reference items
in different view hierarchies?  That's illegal.'

Вот мой код и cra sh позиция моего кода):

override func viewWillAppear(_ animated: Bool) {

    super.viewWillAppear(animated)

    // ...

    // set up navigationItem and navigationController look and feeel
    navigationController?.set_iOS12_lookAndFeel()
    navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    navigationItem.largeTitleDisplayMode = .always

    // create NavigationBar.titleView StackView (consisting of a label and a button)
    let titleStackView = UIStackView(frame: CGRect(origin: .zero, size: CGSize(width: self.view.bounds.width, height: 88.0)))
    titleStackView.isUserInteractionEnabled = true
    titleStackView.axis = .horizontal
    titleStackView.alignment = .center
    titleStackView.spacing = 10.0
    // stackView label
    let labelWidth: CGFloat = UIScreen.main.bounds.width - 16.0 - 10.0 - 36.0 - 16.0   // FullScreenWidth minus (Leading + Spacing + ButtonWidth + Trailing)
    let label = UILabel()
    label.font = AppConstants.Font.NavBar_TitleFont
    label.text = self.profileName
    label.textColor = .white
    label.tintColor = .white
    // position label
    label.translatesAutoresizingMaskIntoConstraints = false
    label.widthAnchor.constraint(equalToConstant: labelWidth).isActive = true
    // stackView button
    let buttonWidth: CGFloat = 36.0
    let button = UIButton(frame: CGRect(origin: .zero, size: CGSize(width: buttonWidth, height: buttonWidth)))
    button.setImage(self.profileImageView.image, for: .normal)
    button.isUserInteractionEnabled = true
    button.addTarget(self, action: #selector(self.callProfileBtnMethod), for: .touchUpInside)
    button.frame = CGRect(x: 0, y: 0, width: 36, height: 36)
    button.layer.cornerRadius = button.frame.size.width / 2
    button.layer.masksToBounds = false
    button.clipsToBounds = true
    // position button
    button.translatesAutoresizingMaskIntoConstraints = false
    button.widthAnchor.constraint(equalToConstant: buttonWidth).isActive = true
    button.heightAnchor.constraint(equalToConstant: buttonWidth).isActive = true
    // add label and button to stackView
    titleStackView.addArrangedSubview(label)
    titleStackView.addArrangedSubview(button)
    // position titleStackView
    titleStackView.translatesAutoresizingMaskIntoConstraints = false

    // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    // Here the code crashes !!!!!!!
    titleStackView.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 100.0).isActive = true
    // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    // position cockpitHeaderView (equal in size and position to titleStackView)
    let cockpitHeaderView = UIView(frame: CGRect(origin: .zero, size: CGSize(width: self.view.bounds.width, height: 88.0)))
    cockpitHeaderView.backgroundColor = .green
    cockpitHeaderView.isUserInteractionEnabled = true
    cockpitHeaderView.addSubview(titleStackView)
    cockpitHeaderView.leadingAnchor.constraint(equalTo: titleStackView.leadingAnchor, constant: 0.0).isActive = true
    cockpitHeaderView.topAnchor.constraint(equalTo: titleStackView.topAnchor, constant: 0.0).isActive = true
    cockpitHeaderView.trailingAnchor.constraint(equalTo: titleStackView.trailingAnchor, constant: 0.0).isActive = true
    cockpitHeaderView.bottomAnchor.constraint(equalTo: titleStackView.bottomAnchor, constant: 0.0).isActive = true
    // finally replace NavBar title by custom cockpitHeaderView
    self.title = ""
    self.navigationItem.titleView = cockpitHeaderView
}

Как правильно переместить titleView ???

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...