控制导航栏问题下的定位

时间:2014-09-26 04:19:28

标签: ios xcode autolayout screen-orientation nslayoutconstraint

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

enter image description here

它嵌入在UINavigationController内,所以我按下的按钮位于 Top Space to Superview 约束。

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

enter image description here

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

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

谢谢。

1 个答案:

答案 0 :(得分:6)

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

override func viewDidLoad() {
    super.viewDidLoad()

    if self.respondsToSelector("edgesForExtendedLayout") {
        edgesForExtendedLayout = UIRectEdge.None
    }
}

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

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

如果您转到故事板,请点击“固定”按钮,选择上边距约束,然后选择“顶部布局指南”(参见下图)。

enter image description here

如果您决定使用代码定义所有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))
    }

}

最后,有第四种(混合的)方式来执行你想做的事情。在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)
    }

}