我让 Autolayout 为页面占据整个屏幕宽度的分页滚动视图工作。页面会根据滚动视图的大小自动调整大小。我还没有测试过宽度较小的滚动视图,但如果它有效,请不要评论——我相信它应该。针对 iOS 9,在 Swift 2 中编写代码,在awakeFromNib
.
脚步:
- 定义全屏滚动视图。
- 在滚动视图中,添加一个
UIView
(我称为 mine contentView
),它的顶部、尾部、底部和前导边缘都为零;高度等于滚动视图的高度;但宽度是滚动视图的宽度乘以页数。如果您在视觉上执行此操作,您将看到您的内容视图超出了 Inteface Builder 中的滚动视图。
- 对于 中的每个“页面”
contentView
,添加 Autolayout 规则以将它们并排放置,但最重要的是,给它们每个约束,以便它们的宽度等于滚动视图的宽度,而不是内容视图的宽度。
下面的示例代码。embedChildViewController
这只是我添加子 VC 的便捷方法——看看setupLayoutRulesForPages
. 我正好有两页,所以功能太简单了,但您可以根据需要进行扩展。
在我的视图控制器中:
override func loadView() {
self.view = self.customView
}
override func viewDidLoad() {
super.viewDidLoad()
self.embedChildViewController(self.addExpenseVC, toView: self.customView.contentView, fillSuperview: false)
self.embedChildViewController(self.addCategoryVC, toView: self.customView.contentView, fillSuperview: false)
self.customView.setupLayoutRulesForPages(self.addExpenseVC.view, secondPage: self.addCategoryVC.view)
}
我的自定义视图:
class __AMVCView: UIView {
@IBOutlet weak var scrollView: UIScrollView!
@IBOutlet weak var contentView: UIView!
@IBOutlet weak var pageControl: UIPageControl!
override func awakeFromNib() {
super.awakeFromNib()
self.scrollView.pagingEnabled = true
self.scrollView.bounces = true
self.scrollView.showsHorizontalScrollIndicator = false
self.scrollView.showsVerticalScrollIndicator = false
self.pageControl.numberOfPages = 2
self.contentView.backgroundColor = UIColor.blueColor()
self.scrollView.backgroundColor = UIColor.clearColor()
self.backgroundColor = UIColor.blackColor()
}
func setupLayoutRulesForPages(firstPage: UIView, secondPage: UIView) {
guard self.contentView.subviews.contains(firstPage) && self.contentView.subviews.contains(secondPage)
else {
return
}
let rules = [
"H:|-0-[firstPage]-0-[secondPage]-0-|",
"V:|-0-[firstPage]-0-|",
"V:|-0-[secondPage]-0-|"
]
let views = [
"firstPage" : firstPage,
"secondPage" : secondPage
]
let constraints = NSLayoutConstraint.constraintsWithVisualFormatArray(rules, metrics: nil, views: views)
UIView.disableAutoresizingMasksInViews(firstPage, secondPage)
self.addConstraints(constraints)
// Add the width Autolayout rules to the pages.
let widthConstraint = NSLayoutConstraint(item: firstPage, attribute: .Width, relatedBy: .Equal, toItem: self.scrollView, attribute: .Width, multiplier: 1, constant: 0)
self.addConstraint(widthConstraint)
}
}