我需要创建一个包含滚动视图和页面控件的视图,并在滚动视图中放置7个视图。 要在滚动视图中布置子视图,我使用纯自动布局方法,即here。
所以我的控制器带有XIB文件(我这里不使用故事板)非常简单:它是一个UIScrollView
和UIPageControl
,并设置了所有约束。
我有一个UIView
子类Slide
的XIB,它有2 UIImageViews
和1 UILabel
,还有一些约束。
要向UIScrollView
添加一些观看次数,请在viewDidLayoutSubviews()
中使用此代码:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
scrollView.setTranslatesAutoresizingMaskIntoConstraints(false)
var pSlide: Slide?
for var i = 0; i < 7; i++ {
var slide = Slide(frame: self.view.bounds, imageName: "slide-\(i+1)-bg", text: NSLocalizedString("slides_\(i+1)", comment: ""))
slide.setTranslatesAutoresizingMaskIntoConstraints(false)
scrollView.addSubview(slide)
var dict: [NSObject : AnyObject] = ["currentSlide" : slide]
if let previousSlide = pSlide {
dict["previousSlide"] = previousSlide
let constraintsHorizontal = NSLayoutConstraint.constraintsWithVisualFormat("H:[previousSlide][currentSlide]", options: nil, metrics: nil, views: dict)
scrollView.addConstraints(constraintsHorizontal)
let constraintsVertical = NSLayoutConstraint.constraintsWithVisualFormat("V:|[currentSlide]|", options: nil, metrics: nil, views: dict)
scrollView.addConstraints(constraintsVertical)
} else {
let constraintsVertical = NSLayoutConstraint.constraintsWithVisualFormat("V:|[currentSlide]|", options: nil, metrics: nil, views: dict)
scrollView.addConstraints(constraintsVertical)
let constraintsLeft = NSLayoutConstraint.constraintsWithVisualFormat("H:|[currentSlide]", options: nil, metrics: nil, views: dict)
scrollView.addConstraints(constraintsLeft)
}
if i == 6 {
let constraintsRight = NSLayoutConstraint.constraintsWithVisualFormat("H:[currentSlide]|", options: nil, metrics: nil, views: dict)
scrollView.addConstraints(constraintsRight)
}
pSlide = slide
}
pageControl.numberOfPages = numberOfSlides
view.layoutSubviews()
}
在这段代码中,我创建了一个Slide
实例,并根据纯自动布局方法为其设置了所有必要的约束。
init()
类的 Slide
方法如下所示:
init(frame: CGRect, imageName: String, text: String) {
super.init(frame: frame)
NSBundle.mainBundle().loadNibNamed("Slide", owner: self, options: nil)
self.addSubview(self.view)
self.view.frame = frame
self.layoutIfNeeded()
println("Frame is \(frame); view.frame is \(self.view.frame)")
backgroundImage.image = UIImage(named: imageName)
textLabel.text = text
}
我希望
self.view.frame = frame
self.layoutIfNeeded()
会帮助我,但不会。问题是,在3.5英寸屏幕上,我所有的UIScrollView子视图的高度都是568,这是4英寸显示屏的正常高度,但不是3.5英寸。
我正在viewDidAppear(animated:)
方法中查看高度。但是,在init()
类的Slide
方法中,高度似乎没问题 - 480。
我正在尝试第二天解决它,但仍然无效。我知道在不使用自动布局和界面生成器的情况下实现这可能要简单得多,但我需要用这些来实现。
答案 0 :(得分:0)
我使用UIPageViewController
而不是所有这些混乱,它运作得很好。