2010-11-04 87 views
12

有没有办法让文字中的可见部分被包裹起来UILabel?我的意思是最后一个可见的角色?UILabel文字的可见部分

我想制作两个标签四舍五入的图像,并希望继续为第二个标签上的第一个标签不正确的文本。

我知道[NSString sizeWithFont...]但有没有像[NSString stringVisibleInRect: withFont:...]颠倒的东西? :-)

预先感谢您。

回答

7

你可以使用一个类来扩展的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 
+1

嗨!谢啦。但在我看来,这种循环方法太重了。我想找一些本地的东西。 – Evgeny 2010-11-07 16:50:07

+0

我不知道有一种方法可以在本地执行此操作。除非你将这个代码称为巨额,否则我不会想象它会对你的应用产生任何负面影响。如果您真的担心内存使用情况,可以查看alloc并释放所有字符串实例。 – Vertism 2010-11-08 15:33:32

+1

我不担心内存,只是处理器负载。看起来sizeWithFont应该很沉重,我想知道有没有办法获得,例如,UILabel事件,当它剪掉一些文本...这是我的问题是关于:-)但在我看来,那里是无法解决的。唯一的办法就是你的。 – Evgeny 2010-11-08 18:37:11

0

这里有一个O(log n)的与iOS 7的API方法。只有表面测试,请评论,如果你发现任何错误。

- (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; 
} 
+0

我想我击败了O(1)击中CoreText:http://stackoverflow.com/a/25899300/860000 – 2014-09-17 20:34:47