在Subview @ viewDidLayoutSubviews

时间:2016-07-05 10:44:54

标签: xcode swift autolayout viewdidappear viewdidlayoutsubviews

我使用Autolayout进行相当复杂的菜单,确实需要它。我的菜单的所有按钮,UIViews等都在一个单独的UIView中,名为" menuSubview"。

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

我试着打电话给" openLastMenu" viewDidAppear,viewDidLayoutSubview中的函数 - 所有" viewDid" ViewController的功能。 " 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"在按钮上总是乱搞整个菜单。我在这里开始变得疯狂:)

1 个答案:

答案 0 :(得分:0)

如果您使用autolayout定位视图,则对框架的任何更改(例如您在此处使用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