sizeToFit无法在程序化的tableview单元格上工作

时间:2017-02-07 19:27:46

标签: ios swift uitableview swift3

我有一个基本的自定义单元格,左边是名称标签,右边的价格标签都设置在另一个视图内,以自定义间距。我希望价格改变宽度到任何价格而不是设置但是当我在单元格init中使用sizetofit或者在函数中使用cellForRow时没有任何反应。我环顾四周但却看不到如何让它发挥作用。在单元格的init中,我无法获得文本大小,但在cellForRowAt中设置标签大小似乎不对。

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

    let cell: SplitterCarouselItemTableViewCell = tableView.dequeueReusableCell(withIdentifier: "splitterCarouselItemTableViewCell") as! SplitterCarouselItemTableViewCell
    var item = ((allBillSplitters[tableView.tag].items)?.allObjects as! [Item])[indexPath.row]
    if allBillSplitters[tableView.tag].isMainBillSplitter {
        getMainBillSplitterItems(splitter: allBillSplitters[tableView.tag])
        item = mainBillSplitterItems[indexPath.row]
    }
    let count = item.billSplitters?.count

    if count! > 1 {
        cell.name!.text = "\(item.name!)\nsplit \(count!) ways"
        cell.price!.text = "£\(Double(item.price)/Double(count!))"

    } else {
        cell.name!.text = item.name!
        cell.price!.text = "£\(item.price)"
    }

    return cell
}

和我的牢房:

import UIKit

class SplitterCarouselItemTableViewCell: UITableViewCell {

    var name: UILabel!
    var price: UILabel!
    var view: UIView!

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:)")
    }

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: "splitterCarouselItemTableViewCell")

        self.setupViews()
    }

    func setupViews() {

        let width = Int(UIScreen.main.bounds.width * 0.88)
        let height = Int(self.bounds.height)

        self.backgroundColor = .clear
        self.frame = CGRect(x: 0, y: 0, width: width, height: 45)

        view = UIView(frame: CGRect(x: 0, y: 2, width: width, height: height - 4 ))
        view.backgroundColor = UIColor.white.withAlphaComponent(0.5)

        price = UILabel(frame: CGRect(x: width - 80, y: 0, width: 75, height: height))
        price.font = UIFont.systemFont(ofSize: 15.0)
        price.backgroundColor = .yellow
        price.textAlignment = .right

        name = UILabel(frame: CGRect(x: 5, y: 0, width: Int(price.frame.width), height: height))
        name.backgroundColor = .red
        name.font = UIFont.systemFont(ofSize: 15.0)
        name.numberOfLines = 0

        view.addSubview(name)
        view.addSubview(price)

        contentView.addSubview(view)
    }
}

任何帮助都会很棒,我确定我缺少一些基本的东西。

我添加了黄色和红色背景,以便在屏幕截图中显示。

Screen Shot

2 个答案:

答案 0 :(得分:1)

您需要根据文字计算价格标签的宽度。下面的代码将帮助您找到宽度

extension String {
    func widthWithConstrainedHeight(height: CGFloat, font: UIFont) -> CGFloat {
        let constraintRect = CGSize(width: .greatestFiniteMagnitude, height: height )
        let boundingBox = self.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil)

        return boundingBox.width
    }
}

使用上述功能查找字符串宽度,并使用该宽度创建价格标签框架。

答案 1 :(得分:0)

我不清楚您是否要调整帧大小或字体大小。这个答案假定后者,即你想要一个固定的帧宽和一个根据需要收缩的字体......

尝试启用 adjustsFontSizeToFitWidth

price = UILabel(frame: CGRect(x: width - 80, y: 0, width: 75, height: height))
price.font = UIFont.systemFont(ofSize: 15.0)
price.backgroundColor = .yellow
price.textAlignment = .right
price.adjustsFontSizeToFitWidth = true

这应缩小字体以适应标签的宽度。