控制导航栏问题下的定位

Isu*_*uru 1 xcode screen-orientation ios autolayout nslayoutconstraint

我对自动布局有疑问.我正在使用xib文件,我有一个像这样的视图控制器.

在此输入图像描述

它嵌入在一个内部,UINavigationController所以我的按钮定位有Top Space to Superview约束.

问题是当我旋转设备时,它看起来像这样.

在此输入图像描述

正如您所看到的那样,约束仍保持其原始值,因此导航栏边缘与横向模式下的按钮之间存在较大差距.

如何使按钮位置靠近导航栏,就像它在纵向中一样,并且在纵向和横向模式下都是这样的?我顺便使用Xcode 6.

谢谢.

Ima*_*tit 6

如果要在Xib文件中定义自动布局上边距约束,可以在ViewController的类文件中相对于Xib添加以下代码:

override func viewDidLoad() {
    super.viewDidLoad()

    if self.respondsToSelector("edgesForExtendedLayout") {
        edgesForExtendedLayout = UIRectEdge.None
    }
}
Run Code Online (Sandbox Code Playgroud)

简单.但问题是你将无法拥有一个半透明的导航栏.

幸运的是,有几种替代方案.您可以使用Storyboard或代码将自动布局上边距定义为相对于"顶部布局指南"(而不是视图).

如果您转到故事板,请单击"固定"按钮,选择上边距约束并选择"顶部布局指南"(请参见下图).

在此输入图像描述

如果您决定UIButton使用代码定义所有约束,则可以使用以下代码中指示的可视格式语言:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        var button = UIButton()
        button.backgroundColor = UIColor.blueColor()

        button.setTranslatesAutoresizingMaskIntoConstraints(false)
        view.addSubview(button)

        var viewsDict = ["button" : button, "topLayoutGuide" : topLayoutGuide]

        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[topLayoutGuide]-20-[button]", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDict))
        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-20-[button]-20-|", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDict))
    }

}
Run Code Online (Sandbox Code Playgroud)

最后,有第四种(混合的)方式来执行你想要做的事情.在Xib中设置约束,将上边距约束拖到UIButton视图控制器类(命名为topConstraintbutton),并将代码设置如下:

import UIKit

class ViewControllerTwo: UIViewController {

    @IBOutlet weak var topConstraint: NSLayoutConstraint!
    @IBOutlet weak var button: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()

        view.addConstraint(NSLayoutConstraint(item: button, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: self.topLayoutGuide, attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: 10))
        view.removeConstraint(topConstraint)
    }

}
Run Code Online (Sandbox Code Playgroud)