动画改变 UILabel 的行数
Posted
技术标签:
【中文标题】动画改变 UILabel 的行数【英文标题】:Animate changing UILabel number of lines 【发布时间】:2015-01-16 04:53:08 【问题描述】:我有一个 UILabel,listDescription,它以 5 行开始显示。它从数据库中抓取大量文本,总行数不确定。我已经实现了一个“显示更多”按钮,当按下它时,它将展开它以显示全部内容。我已经让它工作得很好,但是我希望添加一个动画来改变高度。
我的代码:
@IBAction func toggleDesc(sender: AnyObject)
if (self.listDescription.numberOfLines>0)
self.listDescription.numberOfLines=0
self.showMoreBtn.setTitle("Show Less", forState: UIControlState.Normal)
else
self.listDescription.numberOfLines=5
self.showMoreBtn.setTitle("Show More", forState: UIControlState.Normal)
我尝试在 UIView.animateWithDuration 中封装 numberOfLines 更改,但更改仍然是瞬时的。
我最好的猜测是将标签放在视图中,禁止从该视图溢出,扩大行数,获取标签的新(未显示)高度,并增加视图的大小。但是我不知道在另一个方向上做什么,当点击“少显示”时缩小它。
我愿意接受建议,并将自己做一些实验。
[编辑:所以,我最初担心,如果我替换了显式 numberOfLines 设置并引入了高度约束,文本将不会在末尾正确截断(...如果它太长),但似乎这样做就好了。
也就是说,能够设置行数而不是高度会很方便,因为我希望它在多个设备上看起来一致,即使在我实现了基于屏幕尺寸的自动字体调整之后,平板电脑之类的。
不过,这可以作为以后的考虑因素。我在标签上有一个高度约束,我希望如果我删除约束并将其包装在一些动画代码中,它将调整为完整大小。但是,我仍然无法完全正确地编写代码。]
【问题讨论】:
看看这个问题。似乎numberOfLines
是不可动画的。 ***.com/questions/20958175/…
啊。那里的一些信息及其背后的想法肯定会有所帮助,尽管他们提供的示例/解决方案似乎是在 Objective C 而不是 Swift 中。
我确实从中了解到,如果给标签一个高度限制,并且 numberOfLines 设置为 0,它将保持在该高度并仍然截断文本的尾部(如果这是属性中的设置)。所以这是我最关心的问题之一,但仍然是动画的问题。现在我很好奇是否有办法消除高度限制并将调整动画调整到适当的全高。
【参考方案1】:
您可以尝试一些东西,在动画中,使用带有选项的一个并使用.AllowAnimatedContent
,另外,修改动画中标签的框架,因为您必须根据文本计算新的高度、字体、字体大小和宽度。
编辑:添加了一个扩展来计算高度
extension UIFont
func sizeOfString (string: NSString, constrainedToWidth width: Double) -> CGSize
return string.boundingRectWithSize(CGSize(width: width, height: DBL_MAX),
options: NSStringDrawingOptions.UsesLineFragmentOrigin,
attributes: [NSFontAttributeName: self],
context: nil).size
【讨论】:
您知道获取全文高度所需的代码吗?如果这是我可以动态抓取的东西,那么其余的应该一起落下。我已经放弃了“改变 numberOfLines”的想法,因为在高度限制上使用它似乎没有真正的好处,除了可能具有针对其他设备尺寸的自动调整大小的一些扩展性。 检查答案,我添加了可用于计算字符串高度的代码以上是关于动画改变 UILabel 的行数的主要内容,如果未能解决你的问题,请参考以下文章
swift iOS Swift:如何检查UILabel是否被截断?计算UILabel的行数
当 UITableViewCell 中的行数固定时,UILabel 占用空间?