Переопределить значения центра авторазметки UIButton в Subview @ viewDidLayoutSubviews

Я использую Autolayout для довольно сложного меню и мне действительно это нужно. Все кнопки, UIViews и т. Д. Моего меню находятся в отдельном UIView, называемом "menuSubview".

Если пользователь нажимает кнопку, весь "menuSubview" перемещается в другую позицию, чтобы показать другие части меню. Иногда кнопки в меню Subview также перемещаются. Я всегда сохраняю "Состояние меню" (с пользовательскими ошибками в переменной get-set "lastMenu") и имею функцию для установки альфа и центров в соответствии с сохраненным "состоянием меню".

Я попытался вызвать функцию "openLastMenu" в viewDidAppear, viewDidLayoutSubview - все функции "viewDid" ViewController. Центр "menuSubview" и альфа-кнопки всегда ведут себя как положено... но центры кнопок просто не будут - независимо от того, в каком "viewDid" я вызываю функцию.

(код намного более сложный - я свел его к минимуму, чтобы отладить и изложить свою точку зрения)

override func viewDidAppear(animated: Bool) {

    if lastMenu != nil {openLastMenu()}

}

func openLastMenu(){

    menuSubview.center.x = view.center.x //works
    menuSubview.center.y = view.center.y + 200 //works

    button1.center.x = view.center.x - 50 //why you no behave???
    button2.center.x = view.center.x + 50 //why you no behave???
    button3.alpha = 0 //works
    button4.alpha = 0 //works

}

Для отладки я даже сделал кнопку Subclass для извлечения значений "center" с помощью "didSet", если они меняются. Похоже, что после принятия правильных значений они снова изменяют свое положение Autolayout-Position.

... о, и игнорирование ограничений с "translatesAutoresizingMaskIntoConstraints" на кнопках всегда испортит все меню. Я начинаю сходить с ума здесь:)

1 ответ

Если вы размещаете представления с помощью autolayout, любые изменения в кадре, например, то, что вы делаете здесь со свойством center, будут игнорироваться.

Что вам нужно сделать, это определить ограничения, которые вам нужно изменить, чтобы переместить представления в желаемое положение. Пример:

Вы хотите переместить button1 на 50 пунктов влево от view.center. Предполагая, что представление является суперпредставлением menuSubview, вы бы

1) деактивируйте ограничение, отвечающее за горизонтальное размещение кнопки 1. То, как вы это сделаете, в основном зависит от того, создали ли вы ограничения в коде или в Интерфейсном Разработчике. Последнее потребует от вас создания торговых точек для некоторых ограничений.

2) создайте новое ограничение между привязкой centerX кнопки button1 и привязкой centerX представления с константой -50, например (код iOS 9)

button1.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor, constant: -50.0).active = true

Другие вопросы по тегам