我有一个多线UILabel
(numberOfLines
= 0)。它的宽度可以在运行时改变,有时这会导致截断和/或重新包装。一些例子最好地说明了这一点:
示例 1:宽度的减小导致不同的断线点
示例2:宽度减少导致截断
示例 3:宽度的减小导致截断和不同的换行位置
示例 4:宽度的减小对截断或换行位置没有任何影响
由于格式的这种变化可能非常不和谐,我打算将其隐藏在一些动画后面(可能是淡入/淡出)。然而,第一个障碍是确定when我需要这样做。我不想在标签调整大小时应用动画 - 仅当它会导致截断或换行位置发生变化时。
我该如何测试这个?对于示例 1、2 和 3,测试应返回 YES,但对于示例 4,测试应返回 NO。
注意:在我的示例中,调整大小永远不会改变行数。
注 2:如果有人有一些与文本格式相关的更好标签,我很想知道它们 - 请随意编辑。
注 3:如果您有兴趣看到此行为的完成,请在 iPhone 上尝试 Apple 的 mail.app。查看收件箱时,滑动电子邮件并观察摘要行在重新换行和/或截断时淡入/淡出(但在不需要时不要淡入/淡出)。
斯威夫特3解决方案
您可以在分配字符串后计算行数,并与标签的最大行数进行比较。
import Foundation
import UIKit
extension UILabel {
func countLabelLines() -> Int {
// Call self.layoutIfNeeded() if your view is uses auto layout
let myText = self.text! as NSString
let attributes = [NSFontAttributeName : self.font]
let labelSize = myText.boundingRect(with: CGSize(width: self.bounds.width, height: CGFloat.greatestFiniteMagnitude), options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: attributes, context: nil)
return Int(ceil(CGFloat(labelSize.height) / self.font.lineHeight))
}
func isTruncated() -> Bool {
if (self.countLabelLines() > self.numberOfLines) {
return true
}
return false
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)