在 UILabel 上调用 sizeToFit() 并不总是在自定义表格视图单元格中产生正确的结果

Posted

技术标签:

【中文标题】在 UILabel 上调用 sizeToFit() 并不总是在自定义表格视图单元格中产生正确的结果【英文标题】:Calling sizeToFit() on UILabel doesn't always yield proper result in custom tableview cell 【发布时间】:2016-01-10 16:22:05 【问题描述】:

我有一个当前的自定义 tableview 单元格,并且我有一个 UILabel 正在填充多行长的文本。但是,我不想更改自定义单元格的大小,所以我希望 UILabel 适应给定的大小。这是我的问题:

    第一次加载表格时,UILabel 不会反映正确的高度,并且不会显示前 3 或 4 个单元格的自动换行

    一旦我开始滚动,新单元格会反映正确的高度,而向后滚动会导致旧单元格反映正确的高度。

    如果我不断来回滚动,标签会缩小宽度并被压扁。

我也在使用自动布局。这是格式化后的标签代码:

private func assignBusAndRouteTextForIndex(card: ETACard, index: Int) 
        card.busNumberLabel.text = jsonValueForIndexAndSubscript(index, string: "rd")

        var route = jsonValueForIndexAndSubscript(index, string: "fd")
        route = route.stringByReplacingOccurrencesOfString("&", withString: "&")
        print(route)

        card.routeLabel.text = route
        card.routeLabel.adjustsFontSizeToFitWidth = true
        card.routeLabel.sizeToFit()
    

    private func jsonValueForIndexAndSubscript(index: Int, string: String) -> String 
        return self.items.arrayValue[index][string].description;
    

这是我的自动布局约束:

最后,我的自定义表格视图单元格类如下所示:

import Foundation
import UIKit

//Dependancies
import AnimationsFramework

class ETACard: UITableViewCell 
    @IBOutlet weak var card: UIView!
    @IBOutlet weak var busNumberLabel: UILabel!   // Contains 'Bus:'
    @IBOutlet weak var routeLabel: UILabel! // Contains 'Via:'
    @IBOutlet weak var circleView: UIView!  // Contains the timing circle
    @IBOutlet weak var timeLabel: UILabel!  // Contains the arrival time

    override func layoutSubviews() 
        cardSetup()
        self.addSubview(card)
    

    func cardSetup() 
        self.card.alpha = 1
        self.card.layer.masksToBounds = false
        self.card.layer.cornerRadius = 1
        self.card.layer.shadowOffset = CGSizeMake(-0.2, 0.2)
        self.card.layer.shadowRadius = 1

        let path = UIBezierPath(rect: self.card.bounds)
        self.card.layer.shadowPath = path.CGPath

        self.card.layer.shadowOpacity = 0.2
    

    func renderCircleForBusTime(busTime: Int) 
        ShapeRenderer.renderCircleForBusTime(circleView, busTime: busTime)
    

    func removeCircleFromCard(view: UIView) 
        ShapeRenderer.removeRenderedCircle(view);
    

编辑:

以下是我所说的一些渐进式屏幕截图。在每个屏幕截图之间是滚动到列表底部,然后备份。

请注意文本是如何逐渐缩小并开始被剪切的。

【问题讨论】:

你能添加你得到的结果的截图吗? 【参考方案1】:

经过大量搜索,我找到了这个主题的主题: UILabel sizeToFit doesn't work with autolayout ios6

事实证明,使用 AutoLayout,sizeToFit 不是一个选项。所以我去查看我的自动布局设置,发现我的底部设置为equal 30px,而它应该是less than or equal to 30px,这样文本框下的空间就可以展开了。只要您的边有约束或有宽度约束,自动布局就应该处理它,并且您将高度 <= 设置为一定大小。

【讨论】:

以上是关于在 UILabel 上调用 sizeToFit() 并不总是在自定义表格视图单元格中产生正确的结果的主要内容,如果未能解决你的问题,请参考以下文章

在带有阴影的 UILabel 上使用 SizeToFit()?

如何以编程方式在 UILabel 上设置 sizeToFit 宽度和高度?

UILabel 的 sizeToFit/sizeThatFits 忽略 numberoflines 属性

你如何收紧 UILabel sizeToFit 以使用更小的边距?

uilabel sizetofit 不起作用

UITableViewCell`sizeToFit`中的UILabel在AutoLayout的单元格内不起作用