如何判断UILabel何时被截断和/或其换行位置将会改变

Ben*_*ard 5 cocoa-touch objective-c uiview uilabel ios

我有一个多行UILabel(numberOfLines= 0).它的宽度可以在运行时更改,有时这会导致截断和/或重新包装.一些例子说明了这一点:

示例1:宽度的减小导致不同的断点

在此输入图像描述 在此输入图像描述

例2:宽度的减小导致截断

在此输入图像描述 在此输入图像描述

例3:宽度的减小导致截断和不同的断线位置

在此输入图像描述 在此输入图像描述

示例4:宽度的减小对截断或断线位置没有任何影响

在此输入图像描述 在此输入图像描述

由于格式化的这种变化可能非常刺耳,我打算在一些动画后掩盖它(可能是淡入/淡出).然而,第一个障碍是确定何时需要这样做.我不想在标签重新调整大小时应用动画 - 只有当它会导致截断或换行位置发生变化时才会应用动画.

我该怎么测试呢?测试应该返回YES,例如1,2和3,但是例如4的NO.

注意:调整大小永远不会改变我的示例中的行数.

注意2:如果有人有一些与文本格式相关的更好的标签,我很想知道它们 - 随意编辑.

注3:如果您对完成此行为感兴趣,请在iPhone上试用Apple的mail.app.查看收件箱时,滑动电子邮件并在重新包装和/或截断时观看汇总行淡入/淡出(但不是在不需要时).

Nek*_*kto 2

您可以知道显示特定实例所需的标签大小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");
    }
Run Code Online (Sandbox Code Playgroud)

NSString您可以在这里找到更多有用的方法: NSString UIKit Additions Reference

好的,另一种方式做你想做的事:

1) 创建 2 个UILabel具有相同属性的属性,但第二个 ( label2) 将与另一个属性相同width

2)在非编辑模式下设置alpha的属性。label20.0

3)当编辑模式开始时制作这样的动画:

// label1.alpha == 1.0, label2.alpha == 0.0 
{[UIView animateWithDuration:0.5 animations:^{
    label1.alpha = 0.0;
    label2.alpha = 1.0;
}];
Run Code Online (Sandbox Code Playgroud)

4)编辑模式结束时:

{[UIView animateWithDuration:0.5 animations:^{
    label1.alpha = 1.0;
    label2.alpha = 0.0;
}];
Run Code Online (Sandbox Code Playgroud)

这将为您提供与 Mail.app 中相同的结果