ScrollView不会滚动子视图

时间:2017-07-22 06:00:10

标签: ios swift uiscrollview

我无法让UIScrollView滚动。 这是我的代码:

import UIKit

class ViewController: UIViewController, UIScrollViewDelegate {

    var scrollView = UIScrollView()


    override func viewDidLoad() {
        super.viewDidLoad()

        scrollView = UIScrollView(frame : CGRect ( x:0,y:0,width:UIScreen.main.bounds.width,height:UIScreen.main.bounds.height))
        scrollview.delegate = self
        view.addSubview(scrollView)

        for i in 0...14 {
            let numLabel = UILabel(frame : CGRect( x : 0 , y : 10+(i*40) , width : UIScreen.main.bounds.width - 20 : height : 40))
            numlabel.text = "\(i)"
            scrollView.addSubview(numLabel)
        }

    }

}

这使得视图显示但不滚动。

2 个答案:

答案 0 :(得分:2)

滚动视图滚动到其内容大小。 每当您向滚动视图添加子视图时,您应确保滚动视图的内容大小足以适合新视图。 在你的情况下,你没有照顾到这一点。 理想情况下,无论何时添加子视图,都应相应地调整滚动视图内容大小的高度。 在您的情况下,您已将所有标签添加到滚动视图,即在for循环后添加以下行

self.scrollView.contentSize = CGSize(width:self.scrollView.bounds.size.width,height:10+(15‌​*40))

或在添加标签后的for循环中,您可以执行以下操作

self.scrollView.contentSize = CGSize(width:self.scrollView.bounds.size.width,height:10+((i+1)*40))

第二种方法更好。因为如果你向滚动视图添加更多标签,它将会处理这个问题。再次,按照经验法则,每当向滚动视图添加视图时,请确保更新其内容大小以适合所有子视图。

答案 1 :(得分:0)

虽然您可以手动设置contentSize,但我不建议您这样做。

相反,我会对滚动视图的子视图使用约束。自动布局引擎会自动为您计算contentSize。如果设备旋转,它还将负责调整所有内容。

我还建议使用堆栈视图,您不必使用标签的手动框架和它们之间的约束。

所以,你可以这样做:

var scrollView: UIScrollView!

override func viewDidLoad() {
    super.viewDidLoad()

    scrollView = UIScrollView()
    scrollView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(scrollView)

    let stackView = UIStackView()
    stackView.axis = .vertical
    stackView.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(stackView)

    for i in 0 ... 140 {
        let numLabel = UILabel()
        numLabel.translatesAutoresizingMaskIntoConstraints = false
        numLabel.text = "\(i)"
        numLabel.font = .preferredFont(forTextStyle: .body)
        stackView.addArrangedSubview(numLabel)
    }

    NSLayoutConstraint.activate([
        scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
        scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
        scrollView.topAnchor.constraint(equalTo: view.topAnchor),
        scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor),

        stackView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor),
        stackView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor),
        stackView.topAnchor.constraint(equalTo: scrollView.topAnchor),
        stackView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor)
    ])
}

请注意使用UIFont.preferredFont(forTextStyle: .body)来欣赏动态文字。这意味着如果用户在其设置中指定了较大的字体,则会自动在此应用中显示较大的字体。但更重要的是,我们不必计算该字体的标签大小。约束和堆栈视图同时处理标签的框架以及滚动视图的contentSize

为了完整起见,值得注意的是,替代方法是使用UITableViewUICollectionView。这是一种在滚动视图中查看数据的可扩展,内存有效的方式。这超出了这个问题的范围,但是当您考虑创建大型滚动视图时,值得记住。

相关问题