0

我将 Autolayout 用于相当复杂的菜单,并且确实需要它。我的菜单的所有按钮、UIViews 等都在一个名为“menuSubview”的单独 UIView 中。

如果用户按下一个按钮,整个“menuSubview”就会移动到另一个位置以显示菜单的其他部分。有时 menuSubview 中的按钮也会移动。我总是保存“菜单状态”(在 get-set 变量“lastMenu”中使用 Userdefaults),并具有根据保存的“菜单状态”设置 alpha 和中心的功能。

我尝试在 viewDidAppear、viewDidLayoutSubview 中调用“openLastMenu”函数——ViewController 的所有“viewDid”函数。按钮的“menuSubview”中心和 alpha 始终按预期运行......但按钮的中心根本不会 - 无论我调用什么“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

}

为了调试,我什至制作了一个按钮子类来获取带有“didSet”的“中心”值,如果它们发生变化。似乎在采用正确的值后,它们再次更改为它们的 Autolayout-Position。

...哦,忽略按钮上带有“translatesAutoresizingMaskIntoConstraints”的约束总是会搞砸整个菜单。我开始在这里发疯了:)

4

1 回答 1

0

如果您使用自动布局定位视图,则对框架的任何更改(例如您在此处使用 center 属性所做的操作)都将被忽略。

您需要做的是确定您需要更改以将视图移动到所需位置的约束。例子:

您想将 button1 移动到 view.center 的左侧 50 点。假设 view 是 menuSubview 的父视图,你会

1) 停用负责 button1 水平放置的约束。如何做到这一点主要取决于您是在代码中还是在 Interface Builder 中创建了约束。后者将要求您为某些约束创建出口。

2)在button1的centerX锚和视图的centerX锚之间创建一个新的约束,常数为-50,就像这样(iOS 9代码)

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

于 2016-07-05T12:23:55.960 回答