我无法让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)
}
}
}
这使得视图显示但不滚动。
答案 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
。
为了完整起见,值得注意的是,替代方法是使用UITableView
或UICollectionView
。这是一种在滚动视图中查看数据的可扩展,内存有效的方式。这超出了这个问题的范围,但是当您考虑创建大型滚动视图时,值得记住。