Yos*_*far 4 objective-c nsattributedstring uilabel ios
我有一个UILabel固定大小的文本,我设置的文本长度UILabel可以是 200、5 或 500 个字符。我想要做的是计算UILabel在当前UILabel大小下可以放入多少可见文本。
为什么我要这样做?因为我想在...Read more文本的末尾添加一个文本,但不是在整个文本的末尾,只是在UILabel.
提前致谢。
所以我创建了一个返回当前可见字符串高度的方法(使用 UITextView/UITextField 或 UILabel 的大小)并且它也支持 iOS6+,这就是我所做的:
- (NSUInteger)fitString:(NSString *)string intoLabel:(UILabel *)label
{
UIFont *font = label.font;
NSLineBreakMode mode = label.lineBreakMode;
CGFloat labelWidth = label.frame.size.width;
CGFloat labelHeight = label.frame.size.height;
CGSize sizeConstraint = CGSizeMake(labelWidth, CGFLOAT_MAX);
if (SYSTEM_VERSION_GREATER_THAN(iOS_7))
{
NSDictionary *attributes = @{ NSFontAttributeName : font };
NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:string attributes:attributes];
CGRect boundingRect = [attributedText boundingRectWithSize:sizeConstraint options:NSStringDrawingUsesLineFragmentOrigin context:nil];
{
if (boundingRect.size.height > labelHeight)
{
NSUInteger index = 0;
NSUInteger prev;
NSCharacterSet *characterSet = [NSCharacterSet whitespaceAndNewlineCharacterSet];
do
{
prev = index;
if (mode == NSLineBreakByCharWrapping)
index++;
else
index = [string rangeOfCharacterFromSet:characterSet options:0 range:NSMakeRange(index + 1, [string length] - index - 1)].location;
}
while (index != NSNotFound && index < [string length] && [[string substringToIndex:index] boundingRectWithSize:sizeConstraint options:NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil].size.height <= labelHeight);
return prev;
}
}
}
else
{
if ([string sizeWithFont:font constrainedToSize:sizeConstraint lineBreakMode:mode].height > labelHeight)
{
NSUInteger index = 0;
NSUInteger prev;
NSCharacterSet *characterSet = [NSCharacterSet whitespaceAndNewlineCharacterSet];
do
{
prev = index;
if (mode == NSLineBreakByCharWrapping)
index++;
else
index = [string rangeOfCharacterFromSet:characterSet options:0 range:NSMakeRange(index + 1, [string length] - index - 1)].location;
}
while (index != NSNotFound && index < [string length] && [[string substringToIndex:index] sizeWithFont:font constrainedToSize:sizeConstraint lineBreakMode:mode].height <= labelHeight);
return prev;
}
}
return [string length];
}
Run Code Online (Sandbox Code Playgroud)
当然,SYSTEM_VERSION_GREATER_THAN(iOS_7) 都是我定义的宏。你也应该定义你自己的。
祝你好运!
| 归档时间: |
|
| 查看次数: |
8027 次 |
| 最近记录: |