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

Posted

技术标签:

【中文标题】以编程方式在 UITableViewCell 内创建 UIScrollView - ScrollView 不滚动【英文标题】:Programmatically creating a UIScrollView inside of a UITableViewCell - ScrollView doesn't scroll 【发布时间】:2018-04-10 15:45:53 【问题描述】:

我试图在UITableView Cell 中创建一个动态生成的UIScrollViewUIScrollView 是在 ScrollViewClass 中使用 build function 构建的。该类采用一组视图并将它们并排放置,然后返回一个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
    

【问题讨论】:

你正在设置scrollView.translatesAutoresizingMaskIntoConstraints = false,但你没有给它任何限制。试试scrollView.backgroundColor = .red,我猜你不会看到任何红色 - 但你可以看到它的子视图,因为.clipsToBounds 没有设置为true。 @DonMag 我会解决这个问题的!但是,这仍然不能解决滚动问题 附带说明,如果您每次调用 cellForRowAt 时都添加一个滚动视图,您将多次添加它(重复使用单元格)。 您是否检查过它是否解决了滚动问题? @DonMag 抱歉,我该怎么做呢,我对 xcode 还很陌生。但这确实是有道理的,好像视图只是由于剪辑而被禁用,然后触摸检测不存在 【参考方案1】:

你应该使用带有水平轴的 UIStackView,这样滚动视图才能正确获取 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
    

您还应该对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  

【讨论】:

运行您的编码时,它通过间距错误。它也不显示表格中的视图。 请立即尝试。 错误消失了,视图仍然没有显示 现在再试一次。 遗憾的是仍然没有显示,我在 for 循环中打印了视图以检查它们是否正在被拉出,所以与 stactview 有关

以上是关于以编程方式在 UITableViewCell 内创建 UIScrollView - ScrollView 不滚动的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中以编程方式突出显示 UITableViewCell

以编程方式在 UITableViewCell 上显示删除按钮

以编程方式在 UITableViewCell 上设置约束

无法在 UITableViewCell 中以编程方式创建的 UIButton 上设置图像

想知道如何以编程方式在 swift 3.0 中对 UITableViewCell 进行子类化?

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