我有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中)。我还更改了表格,变量等的名称,因为它们最初是完全不同的西班牙语,但我希望它们是可以理解的。
这将是用于其中一个具有已定义标签数量的表的最相关代码(我排除了选择行时发生的事情等等)。
奥特莱斯和变量
@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:
...
}
}
奥特莱斯和变量
@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
}
如果您需要我发布任何其他详细信息,请告诉我,并对任何与英语相关的错误表示抱歉。