2015-01-16 68 views
3

我有一个UILabel,listDescription,它以5行显示。它从数据库中攫取大量文本,并且总数不确定。我已经实现了“显示更多”按钮,按下后,它将展开以显示整个内容。我已经得到它工作正常,但我希望为高度变化添加动画。动画更改UILabel行数

我的代码:

@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) 
    } 
} 

我已经试过包裹numberOfLines在UIView.animateWithDuration变化,但这种变化仍是瞬间完成的。

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

我很乐意提出建议,并且会做一些自己的尝试。 [编辑:所以,我最初担心,如果我替换显式numberOfLines设置,并刚刚引入高度约束,文本将不会在最后截断(如果它太长),但它似乎这样做很好。

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

这可能是以后的考虑。我在标签上有一个高度限制,我希望如果我删除约束并将其包含在某些动画代码中,它将调整为其全尺寸。但是,我仍然不能完全明白代码的正确性。]

+0

看一看这个问题。看起来好像'numberOfLines'不是可动画的。 http://stackoverflow.com/questions/20958175/ios-animating-uilabel-expand –

+0

啊。其中的一些信息和背后的想法绝对有帮助,虽然他们提供的示例/解决方案似乎在Objective C中,而不是Swift。 – MikeOShay

+0

我从中学习到,如果给标签赋予高度约束,并且numberOfLines设置为0,它将保持在该高度并仍然截断文本的尾部(如果这是属性中的设置)。所以这是我的一个担忧,但仍然存在动画问题。 现在我很好奇,如果有一种方法可以删除高度限制并将调整动画设置为适当的全高。 – MikeOShay

回答

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 
    } 
} 
+0

你知道我需要的代码来获得全文的高度吗?如果这是我可以动态抓取的东西,那么其余部分应该会一起落下。我放弃了“改变numberOfLines”的想法,因为它似乎没有真正的好处,除了可能对其他设备尺寸自动调整大小的某种可扩展性。 – MikeOShay

+0

检查答案,我添加了可用于计算字符串高度的代码 –