【问题标题】:UILabel visible part of textUILabel 文本的可见部分
【发布时间】:2010-11-04 19:22:51
【问题描述】:

有没有办法让文字的可见部分以文字包装UILabel?我的意思是最后一个可见的字符?

我想制作两个围绕图像的标签,并希望在第二个标签上继续第一个标签不正确的文本。

我知道[NSString sizeWithFont...],但有没有像[NSString stringVisibleInRect: withFont:...] 这样的反转? :-)

提前谢谢你。

【问题讨论】:

    标签: iphone uilabel


    【解决方案1】:

    您可以使用类别来扩展 NSString 并创建您提到的方法

    @interface NSString (visibleText)
    
    - (NSString*)stringVisibleInRect:(CGRect)rect withFont:(UIFont*)font;
    
    @end
    
    @implementation NSString (visibleText)
    
    - (NSString*)stringVisibleInRect:(CGRect)rect withFont:(UIFont*)font
    {
        NSString *visibleString = @"";
        for (int i = 1; i <= self.length; i++)
        {
            NSString *testString = [self substringToIndex:i];
            CGSize stringSize = [testString sizeWithFont:font];
            if (stringSize.height > rect.size.height || stringSize.width > rect.size.width)
                break;
    
            visibleString = testString;
        }
        return visibleString;
    }
    
    @end
    

    【讨论】:

    • 嗨!谢啦。但在我看来,这种带有循环的方法太重了。我想找一些本地的。
    • 我不知道有一种方法可以在本地执行此操作。除非您大量调用此代码,否则我认为它不会对您的应用程序产生任何负面影响。如果您真的担心内存使用情况,可以查看 alloc 并释放所有字符串实例。
    • 我不担心内存,只担心处理器负载。似乎 sizeWithFont 应该真的很重,我想知道有什么方法可以得到,例如 UILabel 事件,当它裁剪一些文本时......这是我的问题是关于:-) 但在我看来,那里是没有解决办法。唯一的方法是你的。
    【解决方案2】:

    这是一个使用 iOS 7 API 的 O(log n) 方法。仅进行了表面测试,如果发现任何错误,请发表评论。

    - (NSRange)hp_visibleRange
    {
        NSString *text = self.text;
        NSRange visibleRange = NSMakeRange(NSNotFound, 0);
        const NSInteger max = text.length - 1;
        if (max >= 0)
        {
            NSInteger next = max;
            const CGSize labelSize = self.bounds.size;
            const CGSize maxSize = CGSizeMake(labelSize.width, CGFLOAT_MAX);
            NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
            paragraphStyle.lineBreakMode = self.lineBreakMode;
            NSDictionary * attributes = @{NSFontAttributeName:self.font, NSParagraphStyleAttributeName:paragraphStyle};
            NSInteger right;
            NSInteger best = 0;
            do
            {
                right = next;
                NSRange range = NSMakeRange(0, right + 1);
                NSString *substring = [text substringWithRange:range];
                CGSize textSize = [substring boundingRectWithSize:maxSize
                                                          options:NSStringDrawingUsesLineFragmentOrigin
                                                       attributes:attributes
                                                          context:nil].size;
                if (textSize.width <= labelSize.width && textSize.height <= labelSize.height)
                {
                    visibleRange = range;
                    best = right;
                    next = right + (max - right) / 2;
                } else if (right > 0)
                {
                    next = right - (right - best) / 2;
                }
            } while (next != right);
        }
        return visibleRange;
    }
    

    【讨论】:

    猜你喜欢
    • 2022-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 2014-05-20
    相关资源
    最近更新 更多