ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码
当前位置:首页 >> 网络编程 >> IOS开发 >> 使用boundingRectWithSize计算内容高度的坑

使用boundingRectWithSize计算内容高度的坑

来源:网络整理     时间:2015-07-31     关键词:

本篇文章主要介绍了"使用boundingRectWithSize计算内容高度的坑",对于IOS开发感兴趣的同学可以参考一下: iOS中,根据给定的内容、字体,宽度,计算文本高度的函数,iOS7之前使用sizeWithFont,iOS7之后使用boundingRectWithSize。&...

iOS中,根据给定的内容、字体,宽度,计算文本高度的函数,iOS7之前使用sizeWithFont,iOS7之后使用boundingRectWithSize。</span>
- boundingRectWithSize:options:attributes:context:
Calculates and returns the bounding rect for the receiver drawn using the given options and display characteristics, within the specified rectangle in the current graphics context.


Discussion
To correctly draw and size multi-line text, pass NSStringDrawingUsesLineFragmentOrigin in the options parameter.

This method returns fractional sizes (in the size component of the returned CGRect); to use a returned size to size views, you must raise its value to the nearest higher integer using the ceil function.

This method returns the actual bounds of the glyphs in the string. Some of the glyphs (spaces, for example) are allowed to overlap the layout constraints specified by the size passed in, so in some cases the width value of the size component of the returned CGRect can exceed the width value of the size parameter.

根据Discussion描述,返回值CGRect的Size含有小数点,如果使用函数返回值CGRect的Size来定义View大小,必需使用“ceil”函数获取长宽(ceil:大于当前值的最小正数)。


先贴一段自己写的,使用代码:

传入文本内容、字体(这里使用屏幕宽度)

返回矩形区域,注意返回的CGSize长宽必需使用ceil处理

+ (CGSize)sizeForNoticeTitle:(NSString*)text font:(UIFont*)font{
    CGRect screen = [UIScreen mainScreen].bounds;
    CGFloat maxWidth = screen.size.width;
    CGSize maxSize = CGSizeMake(maxWidth, CGFLOAT_MAX);
    
    CGSize textSize = CGSizeZero;
    // iOS7以后使用boundingRectWithSize,之前使用sizeWithFont
    if ([text respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)]) {
        // 多行必需使用NSStringDrawingUsesLineFragmentOrigin,网上有人说不是用NSStringDrawingUsesFontLeading计算结果不对
        NSStringDrawingOptions opts = NSStringDrawingUsesLineFragmentOrigin |
        NSStringDrawingUsesFontLeading;
        
        NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
        [style setLineBreakMode:NSLineBreakByCharWrapping];
        
        NSDictionary *attributes = @{ NSFontAttributeName : font, NSParagraphStyleAttributeName : style };
        
        CGRect rect = [text boundingRectWithSize:maxSize
                                         options:opts
                                      attributes:attributes
                                         context:nil];
        textSize = rect.size;
    }
    else{
        textSize = [text sizeWithFont:font constrainedToSize:maxSize lineBreakMode:NSLineBreakByCharWrapping];
    }
    
    return textSize;
}


这还不是我们今天讨论的坑。

坑在这!坑在这!坑在这!(重说三)

boundingRectWithSize: 方法只是取得字符串的size, 如果字符串中包含\n\r 这样的字符,也只会把它当成字符来计算。但放到UITextView中来解析时,会把它变成回车换行符,那么在显示时就会多出一行的高度出来。


而且,使用stringWithFormat才会忽略\n,使用@“”形式不会。


矬点的做法,大体的实际高度 = boundingRectWithSize计算出来的高度 + \n\r出现的次数 * 单行文本的高度



延伸阅读:
     boundingRectWithSize:options:attributes:context:用法

以上就介绍了使用boundingRectWithSize计算内容高度的坑,包括了方面的内容,希望对IOS开发有兴趣的朋友有所帮助。

本文网址链接:http://www.codes51.com/article/detail_155574.html

相关图片

相关文章