首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何判断何时截断一个UILabel或它的换行位置会发生变化

问如何判断何时截断一个UILabel或它的换行位置会发生变化
EN

Stack Overflow用户
提问于 2012-10-18 01:52:30
回答 5查看 7.5K关注 0票数 5

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

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

​

​

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

​

​

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

​

​

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

​

​

由于格式上的这种变化可能会引起很大的震动,所以我打算在一些动画(可能是淡入/淡出)后面掩盖它。然而,第一个障碍是识别,而是我需要这样做的。我不想应用动画时,标签重新大小-只有当它将导致在截断或行中断位置的改变。

我该怎么测试这个?测试应该返回YES (例如1、2和3 ),但在示例4中不返回。

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

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

注3:如果您有兴趣看到这种行为完成,请尝试苹果的mail.app在iPhone上。查看收件箱时,滑动电子邮件,在重新包装和/或截断(但不需要时)时,查看摘要行淡入/退出。

EN

回答 5

Stack Overflow用户

发布于 2017-03-24 14:31:02

Swift 3解决方案

您可以在分配字符串后计数行数,并将其与标签的最大行数进行比较。

代码语言:javascript
复制
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
    }
}
票数 4
EN

Stack Overflow用户

发布于 2012-10-18 02:05:11

您可以知道显示特定NSString实例所需的标签大小。例如,您可以使用它:

- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(UILineBreakMode)lineBreakMode 如果字符串具有指定的约束,则返回字符串的大小。

因此,您需要的是获取特定字符串的CGSize,并检查它是否大于UILabel大小:

代码语言:javascript
复制
    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)编辑模式开始时,制作这样的动画:

代码语言:javascript
复制
// label1.alpha == 1.0, label2.alpha == 0.0 
{[UIView animateWithDuration:0.5 animations:^{
    label1.alpha = 0.0;
    label2.alpha = 1.0;
}];

4)编辑模式结束时:

代码语言:javascript
复制
{[UIView animateWithDuration:0.5 animations:^{
    label1.alpha = 1.0;
    label2.alpha = 0.0;
}];

这将给出与Mail.app相同的结果。

票数 2
EN

Stack Overflow用户

发布于 2014-04-23 09:02:03

上面的答案是使用折旧的方法,所以我认为下面的代码可能是有用的:

代码语言:javascript
复制
- (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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12945978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档