UIScrollView页面宽度不等于self.view宽度

时间:2014-12-26 20:20:03

标签: ios xcode swift uiscrollview

我有代码:

为什么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)          
    }
...  
}

我在第二页看到的内容: enter image description here

1 个答案:

答案 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
    }
}