我正在尝试在UITableView Cell
中创建动态生成的UIScrollView
。UIScrollView
是使用ScrollViewClass
内的build function
构建的。该类采用视图数组并将它们并排放置,然后返回一个ScrollView
,然后可以将其添加到cell's subviews
中。ScrollView
已添加并可见,但是,ScrollView
不会按预期水平滚动。可以在下面找到所有代码。
滚动视图类
import Foundation
import UIKit
class ScrollViewClass {
let ArrayOfViews: [UIView]
let scrollView = UIScrollView()
init(ArrayOfViews: [UIView]) {
self.ArrayOfViews = ArrayOfViews
}
func build() -> UIScrollView {
scrollView.isScrollEnabled = true
scrollView.frame.size.width = UIScreen.main.bounds.width
scrollView.frame.size.height = UIScreen.main.bounds.height
scrollView.translatesAutoresizingMaskIntoConstraints = false
scrollView.isPagingEnabled = true
scrollView.contentSize = CGSize(width: 2000, height: 500)
scrollView.showsHorizontalScrollIndicator = true
for (index, views) in ArrayOfViews.enumerated() {
scrollView.addSubview(views)
views.frame.origin.x = CGFloat(index) * UIScreen.main.bounds.width / 2
print(index)
}
return scrollView
}
}
TableView CellForRowat
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell: UITableViewCell! = tableView.dequeueReusableCell(withIdentifier: "CellID")
cell.selectionStyle = UITableViewCellSelectionStyle.none;
let view1 = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 500))
let view2 = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 500))
let view3 = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 500))
view1.backgroundColor = UIColor.blue
view2.backgroundColor = UIColor.green
view3.backgroundColor = UIColor.red
let ArrayOfViews = [view1, view2, view3]
let scrollView = ScrollViewClass(ArrayOfViews: ArrayOfViews)
cell.addSubview(scrollView.build())
return cell
}
您应该使用带有水平轴的 UIStackView,以便滚动视图可以正确获取内容大小。
滚动视图类
import Foundation
import UIKit
class ScrollViewClass {
let ArrayOfViews: [UIView]
let scrollView = UIScrollView()
init(ArrayOfViews: [UIView]) {
self.ArrayOfViews = ArrayOfViews
}
func build() -> UIScrollView {
scrollView.isScrollEnabled = true
scrollView.frame.size.width = UIScreen.main.bounds.width
scrollView.frame.size.height = UIScreen.main.bounds.height
scrollView.translatesAutoresizingMaskIntoConstraints = false
scrollView.isPagingEnabled = true
scrollView.contentSize = CGSize(width: 2000, height: 500)
scrollView.showsHorizontalScrollIndicator = true
let stackView:UIStackView = UIStackView()
stackView.axis = .horizontal
stackView.distribution = .fillEqually
stackView.alignment = .fill
stackView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
for (index, views) in ArrayOfViews.enumerated() {
stackView.addArrangedSubview(views)
print(index)
}
scrollView.addSubview(stackView)
stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor, constant: 0).isActive = true
stackView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor, constant: 0).isActive = true
stackView.topAnchor.constraint(equalTo: scrollView.topAnchor, constant: 0).isActive = true
stackView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor, constant: 0).isActive = true
return scrollView
}
}
您还应该在cellForRowAt:
中对scrollView
进行约束
let scrollView = ScrollViewClass(ArrayOfViews: ArrayOfViews)
cell.addSubview(scrollView.build())
scrollView.translatesAutoresizingMaskIntoConstraints = false
scrollView.leadingAnchor.constraint(equalTo: cell.leadingAnchor, constant: 0).isActive = true
scrollView.trailingAnchor.constraint(equalTo: cell.trailingAnchor, constant: 0).isActive = true
scrollView.topAnchor.constraint(equalTo: cell.topAnchor, constant: 0).isActive = true
scrollView.bottomAnchor.constraint(equalTo: cell.bottomAnchor, constant: 0).isActive = true