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.查看收件箱时,滑动电子邮件并在重新包装和/或截断时观看汇总行淡入/淡出(但不是在不需要时).
您可以知道显示特定实例所需的标签大小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
的属性。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;
}];
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 中相同的结果