以编程方式在UITableViewCell内创建UIScrollView - ScrollView不会滚动

时间:2018-04-10 15:45:54

标签: ios swift uitableview uiscrollview

我正在尝试在UIScrollView内创建动态生成的UITableView CellUIScrollView是使用build function中的ScrollViewClass构建的。该类获取一组视图并将它们并排放置,然后返回ScrollView,然后可以将其添加到cell's subviewsScrollView已添加并可见,但ScrollView未按预期水平滚动。所有代码都可以在下面找到。

ScrollViewClass

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
    }

1 个答案:

答案 0 :(得分:0)

您应该将UIStackView与水平轴一起使用,以便scrollview可以正确获取contentSize。

<强> ScrollViewClass

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
    }
}

您还应该为scrollView

中的cellForRowAt:提供约束
    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