[英]NSLayoutConstraint that would pin a view to the bottom edge of a superview
class ViewController: UIViewController {
var created = false
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
if !created {
let scrollView = UIScrollView()
scrollView.backgroundColor = UIColor.grayColor()
view.addSubview(scrollView)
let kidView = UIView()
kidView.backgroundColor = UIColor.redColor()
kidView.translatesAutoresizingMaskIntoConstraints = false
scrollView.addSubview(kidView)
scrollView.translatesAutoresizingMaskIntoConstraints = false
kidView.translatesAutoresizingMaskIntoConstraints = false
view.addConstraints(
NSLayoutConstraint.constraintsWithVisualFormat("H:|[scrollView]|", options: .AlignAllLeft, metrics: nil, views: ["scrollView": scrollView])
)
view.addConstraints(
NSLayoutConstraint.constraintsWithVisualFormat("V:|[scrollView]|", options: .AlignAllLeft, metrics: nil, views: ["scrollView": scrollView])
)
kidView.addConstraints([
NSLayoutConstraint(item: kidView, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 100),
NSLayoutConstraint(item: kidView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 100),
])
scrollView.addConstraints([
NSLayoutConstraint(item: kidView, attribute: .CenterX, relatedBy: .Equal, toItem: scrollView, attribute: .CenterX, multiplier: 1, constant: 0),
NSLayoutConstraint(item: kidView, attribute: .Bottom, relatedBy: .Equal, toItem: scrollView, attribute: .Bottom, multiplier: 1, constant: 0),
// NSLayoutConstraint(item: kidView, attribute: .CenterY, relatedBy: .Equal, toItem: scrollView, attribute: .CenterY, multiplier: 1, constant: 0),
])
created = true
}
}
}
I want to align my custom view to the bottom edge of my UIScrollView
, but I can only seem to align it to the top, or vertical center. 我想将我的自定义视图对齐到我的
UIScrollView
的底部边缘,但我似乎只能将它与顶部或垂直中心对齐。
scrollView.addConstraints([
NSLayoutConstraint(
item: circleContainerView,
attribute: .Top,
relatedBy: .Equal,
toItem: scrollView,
attribute: .Top,
multiplier: 1,
constant: 0),
])
scrollView.addConstraints([
NSLayoutConstraint(
item: circleContainerView,
attribute: .CenterY,
relatedBy: .Equal,
toItem: scrollView,
attribute: .CenterY,
multiplier: 1,
constant: 0),
])
But what I want is to have a picture like this. 但我想要的是拥有这样的照片。 How do I get there?
我如何到达那里?
ScrollView with auto layout works differently either you can use only one subview by setting translatesAutoresizingMaskIntoConstraints = true
and setting contentSize explicitly. 具有自动布局的ScrollView的工作方式不同,您可以通过设置
translatesAutoresizingMaskIntoConstraints = true
并显式设置contentSize来仅使用一个子视图。 Or you set translatesAutoresizingMaskIntoConstraints = false
and let it find out constraint it self. 或者你设置
translatesAutoresizingMaskIntoConstraints = false
并让它找出它自己的约束。
In your case you can add an invisible view inside scroll and pin it to top and set its height to scrollView.bounds.size.height
and then set create constraint with that invisible view 在您的情况下,您可以在滚动内添加一个不可见的视图并将其固定到顶部并将其高度设置为
scrollView.bounds.size.height
然后使用该不可见视图设置创建约束
Change your constraint like this 像这样改变你的约束
scrollView.addConstraints([
NSLayoutConstraint(
item: circleContainerView,
attribute: .Bottom,
relatedBy: .Equal,
toItem: invisibleView,
attribute: .Bottom,
multiplier: 1,
constant: 0),
])
Visit this link for more details, read pure auto layout approach 有关更多详细信息,请访问此链接 ,阅读纯自动布局方法
Update: your modified code 更新:修改后的代码
class ViewController: UIViewController {
var created = false
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
if !created {
let scrollView = UIScrollView()
scrollView.backgroundColor = UIColor.grayColor()
view.addSubview(scrollView)
let kidView = UIView()
kidView.backgroundColor = UIColor.redColor()
scrollView.addSubview(kidView)
scrollView.translatesAutoresizingMaskIntoConstraints = false
kidView.translatesAutoresizingMaskIntoConstraints = false
scrollView.frame = view.bounds;
scrollView.contentSize = view.bounds.size
// Add an invisible view
let inV = UIView()
inV.backgroundColor = UIColor.clearColor()
inV.translatesAutoresizingMaskIntoConstraints = false
scrollView.addSubview(inV)
view.addConstraints(
NSLayoutConstraint.constraintsWithVisualFormat("H:|[scrollView]|", options: .AlignAllLeft, metrics: nil, views: ["scrollView": scrollView])
)
view.addConstraints(
NSLayoutConstraint.constraintsWithVisualFormat("V:|[scrollView]|", options: .AlignAllLeft, metrics: nil, views: ["scrollView": scrollView])
)
var constraint = NSLayoutConstraint(item: inV, attribute: .Top, relatedBy: .Equal, toItem: scrollView, attribute: .Top, multiplier: 1, constant: 0)
view.addConstraint(constraint)
constraint = NSLayoutConstraint(item: inV, attribute: .Left, relatedBy: .Equal, toItem: scrollView, attribute: .Left, multiplier: 1, constant: 0)
view.addConstraint(constraint)
inV.addConstraints([
NSLayoutConstraint(item: inV, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .Width, multiplier: 1, constant: 10),
NSLayoutConstraint(item: inV, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .Height, multiplier: 1, constant: self.view.bounds.size.height),
])
//
kidView.addConstraints([
NSLayoutConstraint(item: kidView, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .Width, multiplier: 1, constant: 100),
NSLayoutConstraint(item: kidView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .Height, multiplier: 1, constant: 100),
])
view.addConstraints([
NSLayoutConstraint(item: kidView, attribute: .CenterX, relatedBy: .Equal, toItem: scrollView, attribute: .CenterX, multiplier: 1, constant: 0),
NSLayoutConstraint(item: kidView, attribute: .Bottom, relatedBy: .Equal, toItem: inV, attribute: .Bottom, multiplier: 1, constant: 0),
])
created = true
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.