在 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 属性