我对Swift很新,我偶然发现了一个问题。我获取一些JSON数据并在TableView中显示它,但问题是每个单元格之间可以有n个标签(来自JSON(因此单元格需要具有不同数量的内容。我如何实现这一点) ?
编辑:我无法真正开始工作,我这样做是为了在创建tableview时添加更多标签。在我的自定义单元格中。
func addViews() {
let rect = CGRect(x: 6, y: 10, width: containerView.frame.width-12, height: 90)
containerView.backgroundColor = UIColor.lightGrayColor()
let view1 = UIView(frame: rect)
view1.layer.shadowColor = UIColor.blackColor().CGColor
view1.layer.masksToBounds = false
view1.layer.shadowOpacity = 0.2
view1.layer.shadowOffset = CGSizeMake(-1, 1)
view1.layer.cornerRadius = 2
view1.backgroundColor = UIColor.whiteColor()
var x = 2 as CGFloat
var y = 2 as CGFloat
var position = CGPointMake(x, y)
i in 1...5 {
let recti = CGRect(x: x, y: y, width: 50, height: 50)
let s = UILabel(frame: recti)
s.text = "\(i)"
y = y + 20
view1.addSubview(s)
print(i)
}
containerView.addSubview(view1)
}
我已将这两行添加到我的TableViewController
中self.tableView.rowHeight = UITableViewAutomaticDimension
self.tableView.estimatedRowHeight = 100
但它不会调整,只会在关闭单元格之前显示第一个标签。
答案 0 :(得分:3)
在自定义单元格类中设置标签,然后使用&autorotate=true
向其发送数据。
cellForRow
这可能是一个巨大的黑客攻击,我确信有更好的方法,但这里有一些功能代码可以在不使用自动布局或预定义标签的情况下动态调整行的大小。您可能需要使用rect高度来使所有内容看起来正确,并且cellForRowAtIndexPath中的remove子视图是细胞重用所必需的。
import UIKit
class cellClass: UITableViewCell {
@IBOutlet weak var containerView: UIView!
func addViews(jsonStuff: [String]){
let rect = CGRect(x: 0, y: 0, width: 100, height: 20)
var x = 50 as CGFloat
let y = 20.0 as CGFloat
var position = CGPointMake(x, y)
for str in jsonStuff{
let label = UILabel(frame: rect)
label.text = str
label.center = position
containerView.addSubview(label)
x = x + 40
//y = y + 20
position = CGPointMake(x,y)
}
}
}
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var table: UITableView!
var stringStuff = ["this", "that", "tje", "blah", "hey"]
override func viewDidLoad() {
super.viewDidLoad()
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return stringStuff.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as! cellClass
if indexPath.row < 2{
let sub = stringStuff[0...2]
cell.addViews(Array(sub))
}else{
cell.addViews(stringStuff)
}
return cell
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
}
答案 1 :(得分:1)
在递增UILabel后不应该更新view1高度,请尝试:
func addViews() {
let rect = CGRect(x: 6, y: 10, width: containerView.frame.width-12, height: 90)
containerView.backgroundColor = UIColor.lightGrayColor()
let view1 = UIView(frame: rect)
view1.layer.shadowColor = UIColor.blackColor().CGColor
view1.layer.masksToBounds = false
view1.layer.shadowOpacity = 0.2
view1.layer.shadowOffset = CGSizeMake(-1, 1)
view1.layer.cornerRadius = 2
view1.backgroundColor = UIColor.whiteColor()
var containerViewHeight = 0 // height for view1
var x = 2 as CGFloat
var y = 2 as CGFloat
var position = CGPointMake(x, y)
i in 1...5 {
let recti = CGRect(x: x, y: y, width: 50, height: 50)
let s = UILabel(frame: recti)
s.text = "\(i)"
y = y + 20
view1.addSubview(s)
containerViewHeight += 50 //your label height
print(i)
}
view1.bounds.size.height = CGFloat(containerViewHeight) // set height
containerView.addSubview(view1)
}
答案 2 :(得分:0)
在heightForRowAtIndexPath
中,检查该indexPath的JSON并找出该单元格所需的高度。然后表格视图将调整行的大小以匹配您的动态内容。
答案 3 :(得分:0)
UITableViewAutomaticDimension
时,会使用 UITableViewCell
。而且你没有设置任何。
您有两种通用方法可以实现这一目标:
在代码中处理
您知道一个标签需要多少高度,因此在rowForHeightAtIndexPath
返回expectedHeightForOneLabel * numberOfLabels
StackView + Autol-layout
如果您正在为iOS 9.0+开发,请将UIStackView
与stackView.axis = .Vertical
一起使用,为您的stackView设置自动布局并设置stackView.distribution = .FillProportionally
,然后开始添加标签。