我有代码:
为什么UIScrollView的页面宽度不等于self.view width?
如果我认为正确,self.view.frame.size.width必须等于scroll.bounds.width和scroll.contentSize必须是self.view.frame.size.width * 4(在这种情况下),是对吗?
很多!!
class ViewController: UIViewController {
@IBOutlet weak var scroll: UIScrollView!
var frame: CGRect = CGRectMake(0, 0, 0, 0)
override func viewDidLoad() {
super.viewDidLoad()
scroll.bounds = self.view.bounds
scroll.frame = self.view.frame
NSLog("%@", UIScreen.mainScreen().bounds.width);
NSLog("%@", scroll.bounds.width);
NSLog("%@", self.view.bounds.width);
NSLog("%@", scroll.contentSize.width);
let colors = [UIColor.redColor(), UIColor.greenColor(), UIColor.yellowColor(), UIColor.magentaColor()];
for index in 0..<colors.count {
frame.origin.x = self.view.frame.size.width * CGFloat(index)
frame.size = self.view.frame.size
var subView = UIView(frame: frame)
subView.backgroundColor = colors[index]
subView.layer.borderColor = UIColor.blackColor().CGColor
subView.layer.borderWidth = 1.0;
self.scroll .addSubview(subView)
}
scroll.contentSize = CGSizeMake(self.view.frame.size.width * CGFloat(colors.count), self.view.frame.size.height)
}
...
}
我在第二页看到的内容:
答案 0 :(得分:1)
(1)如果您以后要将帧设置为一行,则无需设置界限,因此您可以完全删除此行:scroll.bounds = self.view.bounds
(2)将viewDidLoad
中的所有内容移至viewDidLayoutSubviews
,因为您设置的帧数取决于视图的宽度,这可以更改子视图的宽度布局适合屏幕。但我还建议只使用条件执行此代码一次,因为viewDidLayoutSubviews
可以多次调用,并且您应该只运行此代码一次,以免不必要地添加额外的子视图,例如:
@IBOutlet weak var scroll: UIScrollView!
var frame: CGRect = CGRectMake(0, 0, 0, 0)
var viewLaidout:Bool = false
override func viewDidLayoutSubviews() {
if !viewLaidout {
scroll.frame = self.view.frame
let colors = [UIColor.redColor(), UIColor.greenColor(), UIColor.yellowColor(), UIColor.magentaColor()];
for index in 0..<colors.count {
frame.origin.x = self.view.frame.size.width * CGFloat(index)
frame.size = self.view.frame.size
var subView = UIView(frame: frame)
subView.backgroundColor = colors[index]
subView.layer.borderColor = UIColor.blackColor().CGColor
subView.layer.borderWidth = 1.0;
self.scroll.addSubview(subView)
}
scroll.contentSize = CGSizeMake(self.view.frame.size.width * CGFloat(colors.count), self.view.frame.size.height)
viewLaidout = true
}
}