我有一个多行UILabel (numberOfLines = 0)。它的宽度在运行时可能会改变,有时会导致截断和/或重新包装。一些例子最好地说明了这一点:
示例1:宽度的减少导致不同的断线点


示例2:宽度的减少导致截断


示例3:宽度的减少导致截断和不同的换行位置


示例4:宽度的减少对截断或换行位置没有任何影响。


由于格式上的这种变化可能会引起很大的震动,所以我打算在一些动画(可能是淡入/淡出)后面掩盖它。然而,第一个障碍是识别,而是我需要这样做的。我不想应用动画时,标签重新大小-只有当它将导致在截断或行中断位置的改变。
我该怎么测试这个?测试应该返回YES (例如1、2和3 ),但在示例4中不返回。
注意:调整大小永远不会改变我的示例中的行数。
注2:如果有人有一些与文本格式相关的更好的标签,我很想知道它们--请随意编辑。
注3:如果您有兴趣看到这种行为完成,请尝试苹果的mail.app在iPhone上。查看收件箱时,滑动电子邮件,在重新包装和/或截断(但不需要时)时,查看摘要行淡入/退出。
发布于 2017-03-24 14:31:02
Swift 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
}
}发布于 2012-10-18 02:05:11
您可以知道显示特定NSString实例所需的标签大小。例如,您可以使用它:
- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(UILineBreakMode)lineBreakMode如果字符串具有指定的约束,则返回字符串的大小。
因此,您需要的是获取特定字符串的CGSize,并检查它是否大于UILabel大小:
UILabel *label;
CGSize sizeNeeded = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(label.bounds.size.width, MAXFLOAT)];
if (sizeNeeded.height > label.bounds.size.height)
{
NSLog(@"String is truncated");
}您可以在这里找到更有用的NSString方法:NSString UIKit添加参考
好吧,另一种你想做的事:
1)使用相同的属性创建2个UILabel,但第二个(label2)将与另一个width一起创建。
2)在非编辑模式下,将alpha属性label2设置为0.0。
3)编辑模式开始时,制作这样的动画:
// label1.alpha == 1.0, label2.alpha == 0.0
{[UIView animateWithDuration:0.5 animations:^{
label1.alpha = 0.0;
label2.alpha = 1.0;
}];4)编辑模式结束时:
{[UIView animateWithDuration:0.5 animations:^{
label1.alpha = 1.0;
label2.alpha = 0.0;
}];这将给出与Mail.app相同的结果。
发布于 2014-04-23 09:02:03
上面的答案是使用折旧的方法,所以我认为下面的代码可能是有用的:
- (BOOL)isLabelTruncated:(UILabel *)label
{
BOOL isTruncated = NO;
CGRect labelSize = [label.text boundingRectWithSize:CGSizeFromString(label.text) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : label.font} context:nil];
if (labelSize.size.width / labelSize.size.height > label.numberOfLines) {
isTruncated = YES;
}
return isTruncated;
}https://stackoverflow.com/questions/12945978
复制相似问题