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
在您设置的第一个约束中,将其设置为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 次 | 
| 最近记录: |