在VIew加载时设置ScrollView内容大小

时间:2016-03-02 05:42:26

标签: ios swift uiscrollview contentsize

我想在屏幕上加载视图时配置scrollView。但是在使用AutoLayout时内容大小无法正常工作。如果放在ViewDidAppear中,它可以作为预计,但我希望我的scrollview配置ViewDidLoad方法

@IBOutlet weak var addressScrollView: UIScrollView!{
    didSet{

        self.addressScrollView.pagingEnabled = true
        self.addressScrollView.pagingEnabled = true
        self.addressScrollView.showsHorizontalScrollIndicator = false

    }
}

var billQuotes = ["This is bill","Bill Smokes","Bill drinks","But Still Codes"]
var viewFrame: CGRect = CGRectMake(0, 0, 0, 0)

override func viewDidLoad() {
    super.viewDidLoad()
   configureScrollView()
}


override func viewDidLayoutSubviews() {
    self.addressScrollView.contentSize = CGSizeMake(self.addressScrollView.frame.size.width * CGFloat(billQuotes.count+1), self.addressScrollView.frame.size.height)
}
override func viewDidAppear(animated: Bool) {
    //if placed in view did appear it works as expected but i want it to
}
func configureScrollView(){

    for bill in billQuotes{

        var index = find(billQuotes,bill)
        viewFrame.size = self.addressScrollView.frame.size
        viewFrame.size.width = self.addressScrollView.frame.size.width - 20
        viewFrame.origin.x = ((self.addressScrollView.frame.size.width) * CGFloat(index!)) + 10
        let addressView = UIView()
        addressView.layer.borderWidth = 2.0
        addressView.layer.borderColor = UIColor.grayColor().CGColor
        addressView.layer.cornerRadius = 5
        addressView.frame = viewFrame
        addressView.backgroundColor = UIColor(red: 0.847, green: 0.847, blue: 0.843, alpha: 1.00)

        var billLabel = UILabel(frame: CGRectMake(32, 8, addressView.frame.size.width - 34, 30))
        billLabel.textAlignment = NSTextAlignment.Left
        billLabel.text = "\(bill)"
        billLabel.font = UIFont.systemFontOfSize(20)
        billLabel.textColor = UIColor(red: 0.337, green: 0.341, blue: 0.345, alpha: 1.00)
        addressView.addSubview(billLabel)
        addressScrollView.addSubview(addressView)
    }

}

UPDated:我希望我的scrollView在viewDidLoad中进行配置,以便在视图显示后的几秒钟后立即看到

3 个答案:

答案 0 :(得分:0)

尝试根据您的观看次数(UIScrollViewviewDidLoad)在addressView中设置billLabel的内容大小

ScrollView.contentSize = CGSizeMake(<Calculate width>, <Calculate height>)

答案 1 :(得分:0)

你应该覆盖viewWillLayoutSubviews并将configureScrollView()放在那里。

答案 2 :(得分:0)

问题是,当您在configureScrollView()中呼叫viewDidLoad时,其layoutSubviews尚未运行,因此UIScrollView不知道它自己frame }与superview有关。因此,当您在viewDidLoad中对其进行配置时,它将针对view的框架进行正确配置,然后该框架将发生变化(self.view.frame可能600 widthheight这里)。在viewDidAppear viewDidLayoutSubviews已经执行了superview,这就是为什么它在这里工作的原因,因为现在frame有正确的layoutSubviews

在配置UIScrollView之前,您可以强制override func viewDidLoad() { super.viewDidLoad() self.view.setNeedsLayout() // Not sure if this is needed self.view.layoutIfNeeded() // Not sure if this is needed self.addressScrollView.setNeedsLayout() self.addressScrollView.layoutIfNeeded() configureScrollView() self.addressScrollView.contentSize = CGSizeMake(self.addressScrollView.frame.size.width * CGFloat(billQuotes.count+1), self.addressScrollView.frame.size.height) } 。我真的不明白需要强制哪些观点背后的逻辑,所以你不得不玩它一点。但事情就是这样:

{{1}}