如何以编程方式为增长的动态视图添加约束?

时间:2015-03-05 05:15:13

标签: ios

我有基于其计数的数组我希望在滚动视图上有多个uiviews彼此相邻显示,我应该能够水平滚动到最后一个视图。如何以编程方式添加这些视图的约束?

如何为这些视图添加约束,以便每个视图的边缘都固定在xib的角落以进行设备方向?

1 个答案:

答案 0 :(得分:0)

它包括:

  1. 为每个子视图定义高度限制,如下所示:

    V:|[subview(==scrollView)]|
    

    |[subview]|告诉它将contentSize调整为子视图的高度。 (==scrollView)表示子视图的高度应与滚动视图的bounds相同。 (这两件事听起来很相似,但它们完全不同。)

  2. 您希望将一组水平约束转换为:

    H:|[subview1(==scrollView)][subview2(==scrollView)][subview3(==scrollView)]|
    
  3. 因此,以编程方式,它看起来像:

    scrollView.pagingEnabled = true
    
    var previousSubview: UIView!
    var views: [String: UIView]!
    
    for object in objects {
        let subview = UIView()
        subview.setTranslatesAutoresizingMaskIntoConstraints(false)
        scrollView.addSubview(subview)
    
        views = ["subview" : subview, "scrollView" : scrollView]
        if previousSubview == nil {
            // it's first subview, so leading constraint is to the scroll view
    
            scrollView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[subview(==scrollView)]", options: nil, metrics: nil, views: views))
        } else {
            // it's not first subview, so leading constraint is to the previous subview
    
            views["previousSubview"] = previousSubview
            scrollView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:[previousSubview][subview(==scrollView)]", options: nil, metrics: nil, views: views))
        }
    
        scrollView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[subview(==scrollView)]|", options: nil, metrics: nil, views: views))
    
        previousSubview = subview
    }
    scrollView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:[previousSubview]|", options: nil, metrics: nil, views: views))
    

    显然,这是一个Swift实现,但Objective-C实现在功能上是相同的(相同的API调用,相同的约束集)。但希望这说明了这个想法。


    话虽如此,我同意PraveenM的看法,集合视图通常是处理这种UI的更谨慎的方式。或者,如果这些子视图非常复杂并且可以从与其关联的自己的视图控制器中受益,则页面视图控制器是另一种选择。将所有这些视图添加到前面的滚动视图更复杂,并且是对内存的过度使用。