动画改变 UILabel 的行数

Mik*_*hay 5 uilabel swift xcode6 ios8.1

我有一个 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试在 UIView.animateWithDuration 中包装 numberOfLines 更改,但更改仍然是即时的。

我最好的猜测是将标签放在视图中,禁止从该视图溢出,扩大行数,获取标签的新(未显示)高度,并增加视图的大小。但是我不知道在另一个方向上做什么,因为当点击“Show less”时缩小它。

我愿意接受建议,并将自己做一些实验。

[编辑:所以,我最初担心如果我替换了明确的 numberOfLines 设置并只引入了高度约束,文本在最后不会正确截断(......如果它太长),但它似乎是这样做的正好。

也就是说,能够设置行数而不是高度会很方便,因为我希望它在多个设备上看起来一致,即使在我根据屏幕尺寸、平板电脑等实现自动字体大小调整之后.

不过,这可以作为以后的考虑。我在标签上有一个高度限制,我希望如果我删除这个限制并将它包裹在一些动画代码中,它会调整到它的全尺寸。但是,我仍然不能完全正确地获得代码。]

Jua*_*rre 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
    }
}
Run Code Online (Sandbox Code Playgroud)