以编程方式为UIButton创建约束

时间:2016-07-10 16:06:31

标签: ios swift autolayout nslayoutconstraint

我有UIViewController,其中包含UIScrollView,其中包含UIImageView.我已经以编程方式创建了UIButton(我的项目不包含故事板/笔尖)。

我希望按钮保持固定在屏幕的右上角,但我无法弄清楚如何手动创建适当的约束。

我认为以下内容可行,但按钮仍未正确定位。我是否还需要在viewWillLayoutSubviews()中执行某些操作?

// Setup constraints, in viewDidLoad()
let viewDict = ["shareButton": self.shareButton!]
self.scrollView.addConstraints(NSLayoutConstraint.constraints(
                             withVisualFormat: "H:[shareButton]|", 
                                      options: [], 
                                      metrics: nil, 
                                        views: viewDict))

self.scrollView.addConstraints(NSLayoutConstraint.constraints(
                             withVisualFormat: "V:|[shareButton]",
                                      options: [], 
                                      metrics: nil, 
                                        views: viewDict))

3 个答案:

答案 0 :(得分:1)

如果滚动视图是应用的顶级视图,则无法实现此布局。滚动视图和滚动视图的后代之间的约束总是约束滚动视图的滚动内容中的descandant。有关详细信息,请参阅Technical Note TN2154 UIScrollView And Autolayout。技术说明准确地解释了您需要做什么:

  

请注意,您可以通过在视图和滚动视图的子树外部的视图(例如滚动视图的超级视图)之间创建约束,使滚动视图的子视图显示为浮动(不滚动)在其他滚动内容上。

您需要按如下方式排列视图层次结构:

+-- UIView (view controller's root view)
    |
    +-- UIScrollView
        |
        +-- UIImageView
        |
        +-- UIButton

或者像这样:

+-- UIView (view controller's root view)
    |
    +-- UIScrollView
    |   |
    |   +-- UIImageView
    |
    +-- UIButton

然后(使用其中任何一种安排)你可以将按钮限制在根视图中,如下所示:

NSLayoutConstraint.activateConstraints([
    shareButton.trailingAnchor.constraintEqualToAnchor(view.trailingAnchor, constant:-8),
    shareButton.topAnchor.constraintEqualToAnchor(view.topAnchor, constant: 8)
])

答案 1 :(得分:0)

如果您在代码中执行所有操作,那么这两个约束不足以完全指定UIIMageView的位置,在这两个约束中至少添加宽度和权重(例如,修改已使用{{1}的约束})。

另外,我建议禁用将autoresizemask转换为H:[shareButton(100)]|的约束。

对于此布局,您无需在shareButton.translatesAutoresizingMaskIntoConstraints = false中执行任何操作。

答案 2 :(得分:0)

您可以在课程结束时添加此扩展程序

extension UIView {


    func addCosntraintsWithFormat(format: String, views: UIView...) {

        var viewsDictionary = [String: UIView]()

        for (index, view) in views.enumerate() {
            let key = "v\(index)"
            viewsDictionary[key] = view
        }

        addConstraints(NSLayoutConstraint.constraintsWithVisualFormat(format, options: NSLayoutFormatOptions(), metrics: nil, views: viewsDictionary))
    }
}

然后你可以添加像这样的约束

self.scrollView.addConstraintsWithFormat("H:[v0(\(YourWidthConstant))]|", views: shareButton)
self.scrollView.addConstraintsWithFormat("V:|[v0(\(YourHeightConstant))]", views: shareButton)

source of this information is this