简体   繁体   English

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

[英]Programmatically creating a UIScrollView inside of a UITableViewCell - ScrollView doesn't scroll

I am attempting to create a dynamically generated UIScrollView within a UITableView Cell . 我正在尝试在UITableView Cell创建动态生成的UIScrollView The UIScrollView is built using a build function within the ScrollViewClass . UIScrollView是使用ScrollViewClassbuild function的。 The class takes an array of views and positions them side by side, then returns a ScrollView which can then be added to the cell's subviews . 该类获取一个视图数组并将它们并排放置,然后返回ScrollView ,然后可以将其添加到cell's subviews The ScrollView is added and visible, however, the ScrollView does not scroll horizontally as intended. ScrollView已添加并可见,但是, ScrollView并未按预期水平滚动。 All of the code for this can be found below. 可以在下面找到所有用于此目的的代码。

ScrollViewClass 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 表格检视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
    }

You should use UIStackView with horizontal axis so the scrollview can get the contentSize properly. 您应该将UIStackView与水平轴一起使用,以便scrollview可以正确获取contentSize。

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

You should also give constraints to the scrollView in the cellForRowAt: 您还应该在cellForRowAt: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  

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM