我已经搜索了其他问题,似乎仍然在使用
swift 3中的autolayout以编程方式创建我的scrollView时遇到了一些麻烦.我能够让我的scrollview显示如下图所示,但是当我滚动到底部时我的其他标签确实如此没有显示,“滚动顶部”标签不会消失.
希望有人可以帮助我们查看下面的代码!
import UIKit
class ViewController: UIViewController {
let labelOne: UILabel = {
let label = UILabel()
label.text = "Scroll Top"
label.backgroundColor = .red
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
let labelTwo: UILabel = {
let label = UILabel()
label.text = "Scroll Bottom"
label.backgroundColor = .green
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
override func viewDidLoad() {
super.viewDidLoad()
let screensize: CGRect = UIScreen.main.bounds
let screenWidth = screensize.width
let screenHeight = screensize.height
var scrollView: UIScrollView!
scrollView = UIScrollView(frame: CGRect(x: 0,y: 120,width: screenWidth,height: screenHeight))
scrollView.contentSize = CGSize(width: screenWidth,height: 2000)
scrollView.addSubview(labelOne)
scrollView.addSubview(labelTwo)
view.addSubview(labelOne)
view.addSubview(labelTwo)
view.addSubview(scrollView)
// Visual Format Constraints
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[v0]|",options: NSLayoutFormatOptions(),metrics: nil,views: ["v0": labelOne]))
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-100-[v0]",views: ["v0": labelOne]))
// Using iOS 9 Constraints in order to place the label past the iPhone 7 view
view.addConstraint(NSLayoutConstraint(item: labelTwo,attribute: .top,relatedBy: .equal,toItem: labelOne,attribute: .bottom,multiplier: 1,constant: screenHeight + 200))
view.addConstraint(NSLayoutConstraint(item: labelTwo,attribute: .right,constant: 0))
view.addConstraint(NSLayoutConstraint(item: labelTwo,attribute: .left,constant: 0)
}
}
解决方法
使用约束来定义滚动内容大小很容易 – 因此您不必进行任何手动计算.
只记得:
>滚动视图的内容元素必须具有左/上/宽度/高度值.对于标签等对象,它们具有固有的大小,因此您只需要定义左侧和右侧.最佳.
>滚动视图的内容元素也定义了可滚动区域的边界 – contentSize – 但是它们使用底部和底部来定义.正确的约束.
>结合这两个概念,您会发现需要一个“连续链”,其中至少有一个元素定义了顶部/左侧/底部/右侧范围.
这是一个简单的示例,它将直接在Playground页面中运行:
import UIKit
import PlaygroundSupport
class TestViewController : UIViewController {
let labelOne: UILabel = {
let label = UILabel()
label.text = "Scroll Top"
label.backgroundColor = .red
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
let labelTwo: UILabel = {
let label = UILabel()
label.text = "Scroll Bottom"
label.backgroundColor = .green
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
let scrollView: UIScrollView = {
let v = UIScrollView()
v.translatesAutoresizingMaskIntoConstraints = false
v.backgroundColor = .cyan
return v
}()
override func viewDidLoad() {
super.viewDidLoad()
// add the scroll view to self.view
self.view.addSubview(scrollView)
// constrain the scroll view to 8-pts on each side
scrollView.leftAnchor.constraint(equalTo: view.leftAnchor,constant: 8.0).isActive = true
scrollView.topAnchor.constraint(equalTo: view.topAnchor,constant: 8.0).isActive = true
scrollView.rightAnchor.constraint(equalTo: view.rightAnchor,constant: -8.0).isActive = true
scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor,constant: -8.0).isActive = true
// add labelOne to the scroll view
scrollView.addSubview(labelOne)
// constrain labelOne to left & top with 16-pts padding
// this also defines the left & top of the scroll content
labelOne.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor,constant: 16.0).isActive = true
labelOne.topAnchor.constraint(equalTo: scrollView.topAnchor,constant: 16.0).isActive = true
// add labelTwo to the scroll view
scrollView.addSubview(labelTwo)
// constrain labelTwo at 400-pts from the left
labelTwo.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor,constant: 400.0).isActive = true
// constrain labelTwo at 1000-pts from the top
labelTwo.topAnchor.constraint(equalTo: scrollView.topAnchor,constant: 1000).isActive = true
// constrain labelTwo to right & bottom with 16-pts padding
labelTwo.rightAnchor.constraint(equalTo: scrollView.rightAnchor,constant: -16.0).isActive = true
labelTwo.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor,constant: -16.0).isActive = true
}
}
let vc = TestViewController()
vc.view.backgroundColor = .yellow
PlaygroundPage.current.liveView = vc