【问题标题】:Controls positioning under the navigation bar issue控制导航栏下的定位问题
【发布时间】:2014-09-26 04:19:27
【问题描述】:

我有一个关于自动布局的问题。我正在使用 xib 文件,并且我有一个像这样的视图控制器。

它嵌入在 UINavigationController 中,因此我将按钮定位为 Top Space to Superview 约束。

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

如您所见,约束仍然保持其原始值,因此导航栏边缘和横向模式下的按钮之间存在很大差距。

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

谢谢。

【问题讨论】:

  • 约束的乘数值是多少?
  • 乘数值为1。
  • 确实设置为零
  • Xcode 不允许我将其设置为 0。我能达到的最低值是 0.1,但它不起作用。
  • 我建议你使用以下字符串“V:|(button)”切换到可视格式,这应该可以工作

标签: ios xcode autolayout screen-orientation nslayoutconstraint


【解决方案1】:

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

override func viewDidLoad() {
    super.viewDidLoad()

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

简单。但是问题是你不能有一个半透明的导航栏。

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

如果您移至 Storyboard,请点击 Pin 按钮,选择您的上边距限制并选择顶部布局指南(见下图)。

如果您决定用代码定义所有UIButton 的约束,您可以使用Visual Format Language,如以下代码所示:

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)
    }

}

【讨论】:

  • 再次感谢您!我正在使用 xib 文件,所以我采用了最后一个。像魅力一样工作。
  • 第四个选项真的很有帮助。
猜你喜欢
  • 1970-01-01
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多