2017-01-03 47 views
0

我有一个UITableView,需要通过列出风格类似在一个UITableView对齐多个运行时产生的UILabels

enter image description here

但棘手的部分,以支持内容是“标签”的量将随着每一个变化细胞,一些可具有仅4,但也达12同样,“值”可以是单个单词或短语短至多两行(如上面在图像中)。所以我决定用UIStackView帮我收拾行李,并用于显示此大小我UILabels。我目前停留在一个问题,当“标签”中,例如,长度变化: enter image description here

我需要的“价值”的前端像第一图像对准即使“标签”长短不一。是否有这样的行为UIStackView?还是有另一种方法可以让我获得我需要的结果?

注:每一个“标签”和“价值”是一个UIStackView,我这样做是为了将它们对齐。

我尝试使用字符串格式化过,但“价值”与一个以上的生产线将在标签,而不是包装在包装本身就像我管理的图像做。

我试着把所有的“标签”放在一个UIStackView和所有的“值”在另一个,我不能让他们像在图像中一样,“价值”超过一行对齐。

或者,如果它可能是一个错误,我什么地方做,这是我创建的UIStackViews

var higherCount = 0 
    if labels.count<values.count { 
     higherCount = values.count 
    } else { 
     higherCount = labels.count 
    } 

    mainStackView = UIStackView(frame: CGRect(x: 0, y: 0, width: frame.width, height: frame.height)) 

    for i in 0..<higherCount { 
     var height:CGFloat = 20 
     if (values[i] as NSString).size(attributes: [NSFontAttributeName:UIFont.systemFont(ofSize: UIFont.systemFontSize)]).width > frame.width { 
      height = 42 
     } 

     let stackViewToAdd = UIStackView(frame: CGRect(x: 0, y: 0, width: frame.width, height: height)) 

     let label = UILabel(frame: CGRect(x: 0, y: 0, width: frame.width, height: height)) 
     if labels.count<higherCount { 
      label.text = "" 
     } else { 
      label.text = labels[i] 
     } 
     label.setContentCompressionResistancePriority(1000, for: .horizontal) 
     label.setContentHuggingPriority(999, for: .horizontal) 
     stackViewToAdd.addArrangedSubview(label) 
     let value = UILabel(frame: CGRect(x: 0, y: 0, width: frame.width, height: height)) 
     if values.count<higherCount { 
      value.text = "" 
     } else { 
      value.text = values[i] 
     } 
     value.lineBreakMode = .byWordWrapping 
     value.numberOfLines = 2 
     stackViewToAdd.addArrangedSubview(value) 
     mainStackView?.addArrangedSubview(stackViewToAdd) 
    } 
    mainStackView?.alignment = .fill 
    mainStackView?.axis = .vertical 
    mainStackView?.distribution = .fill 
+0

用户可以自上浆的tableview细胞 –

+0

@VinupriyaArivazhagan你能解释一下吗?我尝试过使用它,但因为我的整个单元格是以编程方式创建的,所以单元格根本不会调整大小。 –

回答

1

我创建你的程序,那么你可以调整细胞编程取决于的UILabel的大小内容。

对我来说Label字体是UIFont.systemFont(ofSize: 15),最小TableViewCell高度是50,arrLabel1arrLabel2将是标签的内容。

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return arrLable1.count 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = UITableViewCell(style: .default, reuseIdentifier: "\(indexPath.row)") 

    let lable1 = UILabel(frame: CGRect(x: 10, y: 10, width: view.frame.size.width - 20, height: 0)) 
    lable1.numberOfLines = 0 
    lable1.font = UIFont.systemFont(ofSize: 15) 
    lable1.text = arrLable1[indexPath.row] 
    lable1.sizeToFit() 
    cell.addSubview(lable1) 

    let lable2 = UILabel(frame: CGRect(x: 10, y: lable1.frame.origin.y + lable1.frame.size.height + 10 , width: view.frame.size.width - 20, height: 0)) 
    lable2.numberOfLines = 0 
    lable2.font = UIFont.systemFont(ofSize: 15) 
    lable2.text = arrLable2[indexPath.row] 
    lable2.sizeToFit() 
    cell.addSubview(lable2) 

    return cell 
} 

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) 
    -> CGFloat { 

    let boundingRect1 = arrLable1[indexPath.row].boundingRect(with: CGSize(width: view.frame.size.width - 40 , height: CGFloat(MAXFLOAT)), options: NSStringDrawingOptions.usesLineFragmentOrigin,attributes:[ NSFontAttributeName : UIFont.systemFont(ofSize: 15)] ,context: nil) 

    let boundingRect2 = arrLable2[indexPath.row].boundingRect(with: CGSize(width: view.frame.size.width - 40 , height: CGFloat(MAXFLOAT)), options: NSStringDrawingOptions.usesLineFragmentOrigin,attributes:[ NSFontAttributeName : UIFont.systemFont(ofSize: 15)] ,context: nil) 

    guard boundingRect1.height + boundingRect2.height + 30 > 50 else { 
     return 50 
    } 

    return boundingRect1.height + boundingRect2.height + 30 
} 

设置Label numberOfLines 0

+0

谢谢,这很有用,但它并没有解决我的问题。我遇到的主要问题是单元格中多个标签的对齐。我做了一些计算来设置单元格的高度,但我会试着看看它是否更好。但是我需要在Label to Value关系中整齐排列内容。 –

+0

设置Label1的内容,设置的Label1 sizeToFit(),从Label1的获得帧。对所有标签执行相同操作。然后为所有标签设置“y”位置取决于标签帧。然后重新调整框架。你可以使用上面的代码来获得UITableViewCell高度。 –

+0

所以你建议我计算每个标签的位置用它来计算,而不是使用'UIStackView'大小? –