NSLayoutConstraint将pin视图到一个superview的底部边缘 [英] 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
}
}
}
问题
我的自定义视图到我的 UIScrollView
的底部边缘,但我只能似乎将它对齐到顶部或垂直中心。
Problem
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.
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?
< img src =https://i.stack.imgur.com/PeqLY.pngalt =enter image description here>
推荐答案
使用自动布局的ScrollView工作方式不同,您可以通过设置 translatesAutoresizingMaskIntoConstraints = true
并显式设置contentSize,只使用一个子视图。
或者你设置 translatesAutoresizingMaskIntoConstraints = false
,让它自己找出约束。
ScrollView with auto layout works differently either you can use only one subview by setting translatesAutoresizingMaskIntoConstraints = true
and setting contentSize explicitly.
Or you set translatesAutoresizingMaskIntoConstraints = false
and let it find out constraint it self.
您可以在滚动内添加一个不可见的视图并将其固定到顶部,并将其高度设置为 scrollView.bounds.size.height
,然后使用该不可见视图设置创建约束
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
更改您的约束,如下所示
Change your constraint like this
scrollView.addConstraints([
NSLayoutConstraint(
item: circleContainerView,
attribute: .Bottom,
relatedBy: .Equal,
toItem: invisibleView,
attribute: .Bottom,
multiplier: 1,
constant: 0),
])
a href =https://developer.apple.com/library/ios/releasenotes/General/RN-iOSSDK-6_0/index.html =nofollow>链接了解详情,阅读纯自动布局方法
Visit this link for more details, read pure auto layout approach
更新:您修改的代码
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
}
}
}
这篇关于NSLayoutConstraint将pin视图到一个superview的底部边缘的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!