如何防止UITableViewCell的内容在水平滚动时消失

时间:2017-02-01 20:37:10

标签: ios uitableview horizontal-scrolling

一般说明

我有3个UITableViews,它们存在一个不太大的空间,必须水平滚动,所以我使用UIScrollViews作为标题,然后我使用它们的contentOffset让它们一起滚动。每个表都有1个原型单元格,并有自己的自定义类。

这是ScrollViews的结构:

scrollView
    //The next objects apply only to the tables with a predefined number of labels (2 of 3)
    view
        label1
        label2
        label3
        label4

这是TableViews的结构:

tableView
    tableViewCell
        contentView
            view
                //Case 1: They have labels here (2 of 3 tables),
                //Case 2: The labels are created here too but programatically, according to a web service result (1 of 3 tables)

我使用cellForRowAt函数来1)设置标签的文本或2)以编程方式创建未定义数量的标签,设置文本并使用cell.view.addSubview(label)添加它们。

表格框架宽度为205px,但是contentSize(我在cellForRowAt函数上设置)通常比那个宽(特别是在标签数量不确定的情况下)。当我水平滚动(垂直没有问题到目前为止)时出现问题,因为在表contentOffset达到205px的确切时刻,那里的所有标签都消失了。如果我更改了表格框架的宽度,那么标签会在contentOffset与新宽度匹配时消失,这会发生在3个表格中。就像这样(表格框架宽度= 205):

contentOffset = 204.5

 _________________________
|le2  title3  title4  titl|
|-------------------------|
|el2  label3  label4  labe|
|el2  label3  label4  labe|
|el2  label3  label4  labe|

contentOffset = 205

 _________________________
|e2  title3  title4  title|
|-------------------------|
|                         |
|                         |
|                         |

如果你继续滚动它会滚动直到最终标题的结尾(就像它应该)。标题永远不会消失,只有TableView内容。

我已经尝试将___.frame.size.width设置为tableViewCell,contentView和view所需的宽度,但这没有帮助。

代码

考虑到我有其他表,所以一些函数或表验证也用于其他表(每个表都在自己的if或case中)。我还更改了表格,变量等的名称,因为它们最初是完全不同的西班牙语,但我希望它们是可以理解的。

这将是用于其中一个具有已定义标签数量的表的最相关代码(我排除了选择行时发生的事情等等)。

View和ScrollView

的View Controller类

奥特莱斯和变量

@IBOutlet var titlesScrollView : UIScrollView!
//this is the View inside of the ScrollView
@IBOutlet var titlesSubView    : UIView!
@IBOutlet var dataTable        : UITableView!
var dataArray                  : [JSON] = []

viewDidLoad中

override func viewDidLoad() {
    titlesScrollView.delegate = self
    dataTable.delegate        = self
    dataTable.dataSource      = self

    titlesScrollView.contentSize = CGSize(width: titlesSubView.frame.width, height: titlesSubView.frame.height)

    loadTables()
}

loadTables

func loadTables() {
    self.loadData { error in
        //if error == nil continues loading other tables and so
    }
}

loadData

func loadData(onCompletion:@escaping (NSError?)->Void) -> Void {
    DispatchQueue.main.async {
        WebServices.sharedInstance.getData(/*parameters*/) { (json, error) in
            if error == nil {
                if let tempArray = json?["items"].array {
                    self.dataArray = tempArray

                    DispatchQueue.main.async {
                        let offset = self.dataTable.contentOffset
                        self.dataTable.reloadData()
                        self.dataTable.contentOffset(offset, animated: false)
                    }

                    onCompletion(nil)
                } else {
                    /*error handling*/
                }
            } else {
                /*error handling*/
            }
        }
    }
}

numberOfRowsInSection

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    switch tableView {
        //Other cases...
        case dataTable: return self.dataArray.count
        default: return 0
    }

}

cellForRowAt

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let index = indexPath.row

    if tableView == otherTables {
        ...
    } else if tableView == dataTable {

        let cell      = tableView.dequeueReusableCell(withIdentifier: "cell") as! dataCell

        cell.id          = dataArray[index]["id"].intValue
        cell.label1.text = dataArray[index]["value1"].stringValue
        cell.label2.text = dataArray[index]["value2"].stringValue
        cell.label3.text = dataArray[index]["value3"].stringValue
        cell.label4.text = dataArray[index]["value4"].stringValue

        tableView.contentSize = CGSize(width: titlesSubView.frame.width, height: tableView.rowHeight*CGFloat(dataArray.count))
        cell.setWidth(titlesSubView.frame.width)

        return cell

    } else {
        ...
    }

}

scrollViewDidScroll

func scrollViewDidScroll(_ scrollView: UIScrollView) {

    let newOffset = scrollView.contentOffset

    switch scrollView.tag {
        //Other cases (for the other ScrollViews and Tables)...
        case titlesScrollView.tag:
            dataTable.setContentOffset(CGPoint(x: newOffset.x,
                                               y: dataTable.contentOffset.y), animated: false)
        case dataTable.tag:
            titlesScrollView.setContentOffset(CGPoint(x: newOffset.x,
                                                      y: titlesScrollView.contentOffset.y), animated: false)
        default:
            ...
    }

}

该表的原型单元格的类(“dataCell”)

奥特莱斯和变量

@IBOutlet var contentViewCell : UIView!
@IBOutlet var viewCell        : UIView!
@IBOutlet var label1          : UILabel!
@IBOutlet var label2          : UILabel!
@IBOutlet var label3          : UILabel!
@IBOutlet var label4          : UILabel!
var id                        : Int!
private var cellWidth         : CGFloat = 0

layoutSubviews

override func layoutSubviews() {
    super.layoutSubviews()
    self.frame.size.width = cellWidth
    //Here is where I did set the frame.size.width for the contentView and View too, but it did nothing about my problem
}

setWidth

func setWidth(_ width: CGFloat){
    cellWidth = width
}

如果您需要我发布任何其他详细信息,请告诉我,并对任何与英语相关的错误表示抱歉。

0 个答案:

没有答案