dea*_*_au 10 nslayoutconstraint ios9 ios10
我遇到了UIScrollView上的约束问题,它似乎是iOS10特有的.我似乎在滚动视图的顶部和内部的内容视图之间有一个间隙,它应该粘在顶部.
在iOS 9上似乎没有任何差距,但在iOS 10上出现差距.
为清楚起见,在两种情况下,滚动视图顶部都固定在顶部布局指南的底部,该指南与导航栏的底部完美对齐.iOS 10在滚动视图顶部和内容视图顶部之间引入了导航栏大小的间隙.
我可以将滚动视图的顶部对齐到顶部布局指南的顶部,这会将间隙放在导航栏下方,内容视图可以正常排列,但在iOS 9上,内容视图将位于导航栏的下方.不受欢迎.
我已经快速创建了一些游乐场代码来演示下面的问题.有什么明显的东西我不见了吗?在iOS 10中发生了什么变化使这成为一个问题,我该如何解决它?
import UIKit
import PlaygroundSupport
class TestViewController: UIViewController {
var mainScrollView: UIScrollView
var contentView: UIView
init() {
self.mainScrollView = UIScrollView()
self.contentView = UIView()
super.init(nibName: nil, bundle: nil)
self.view.backgroundColor = UIColor.white
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
self.mainScrollView.backgroundColor = UIColor.green
self.contentView.backgroundColor = UIColor.blue
self.mainScrollView.translatesAutoresizingMaskIntoConstraints = false
self.contentView.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(self.mainScrollView)
self.mainScrollView.addSubview(self.contentView)
// constrain the scroll view bounds to the view
self.view.addConstraint(NSLayoutConstraint(item: self.mainScrollView, attribute: NSLayoutAttribute.top, relatedBy: NSLayoutRelation.equal, toItem: self.topLayoutGuide, attribute: NSLayoutAttribute.bottom, multiplier: 1, constant: 0))
self.view.addConstraint(NSLayoutConstraint(item: self.mainScrollView, attribute: NSLayoutAttribute.bottom, relatedBy: NSLayoutRelation.equal, toItem: self.bottomLayoutGuide, attribute: NSLayoutAttribute.top, multiplier: 1, constant: 0))
self.view.addConstraint(NSLayoutConstraint(item: self.mainScrollView, attribute: NSLayoutAttribute.leading, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.leading, multiplier: 1, constant: 0))
self.view.addConstraint(NSLayoutConstraint(item: self.mainScrollView, attribute: NSLayoutAttribute.trailing, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.trailing, multiplier: 1, constant: 0))
// constrain the content view bounds to the scroll view
self.mainScrollView.addConstraint(NSLayoutConstraint(item: self.contentView, attribute: NSLayoutAttribute.top, relatedBy: NSLayoutRelation.equal, toItem: self.mainScrollView, attribute: NSLayoutAttribute.top, multiplier: 1, constant: 0))
self.mainScrollView.addConstraint(NSLayoutConstraint(item: self.contentView, attribute: NSLayoutAttribute.bottom, relatedBy: NSLayoutRelation.equal, toItem: self.mainScrollView, attribute: NSLayoutAttribute.bottom, multiplier: 1, constant: 0))
self.mainScrollView.addConstraint(NSLayoutConstraint(item: self.contentView, attribute: NSLayoutAttribute.leading, relatedBy: NSLayoutRelation.equal, toItem: self.mainScrollView, attribute: NSLayoutAttribute.leading, multiplier: 1, constant: 0))
self.mainScrollView.addConstraint(NSLayoutConstraint(item: self.contentView, attribute: NSLayoutAttribute.trailing, relatedBy: NSLayoutRelation.equal, toItem: self.mainScrollView, attribute: NSLayoutAttribute.trailing, multiplier: 1, constant: 0))
// constrain the content view's size to the view's size
self.view.addConstraint(NSLayoutConstraint(item: self.contentView, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.width, multiplier: 1, constant: 0))
self.view.addConstraint(NSLayoutConstraint(item: self.contentView, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.greaterThanOrEqual, toItem: self.view, attribute: NSLayoutAttribute.height, multiplier: 1, constant: 0))
}
}
let rootViewController = TestViewController()
rootViewController.title = "Test"
let navigationController = UINavigationController(rootViewController: rootViewController)
PlaygroundPage.current.liveView = navigationController.view
Run Code Online (Sandbox Code Playgroud)
在您设置的第一个约束中,将其设置为topLayoutGuide bottom. 因此,从 Apple文档bottom来看,取决于您topLayoutGuide堆叠子视图的方式。所以在你的例子中如果你将其设置为
self.view.addConstraint(NSLayoutConstraint(item: self.mainScrollView, attribute: .top, relatedBy: .equal, toItem: self.topLayoutGuide, attribute: .top, multiplier: 1, constant: 0))有用。
但我经常使用子视图的顶部,这样我就没有“边距”。所以它可能看起来像:self.view.addConstraint(NSLayoutConstraint(item: self.mainScrollView, attribute: .top, relatedBy: .equal, toItem: self.view, attribute: .top, multiplier: 1, constant: 0))。
希望能帮助到你。
| 归档时间: |
|
| 查看次数: |
660 次 |
| 最近记录: |