学习boundingRectWithSize:options:attributes:context:计算文本尺寸

oundingRectWithSize:options:context:

 返回文本绘制所占据的矩形空间。html

- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options context:(NSStringDrawingContext *)context

 

参数ios

sizeapp

宽高限制,用于计算文本绘制时占据的矩形块。布局

The width and height constraints to apply when computing the string’s bounding rectangle.字体

optionsui

文本绘制时的附加选项。可能取值请参考“NSStringDrawingOptions”spa

contextcode

context上下文。包括一些信息,例如如何调整字间距以及缩放。最终,该对象包含的信息将用于文本绘制。该参数可为 nil 。htm

返回值对象

一个矩形,大小等于文本绘制完将占据的宽和高。

讨论

能够使用该方法计算文本绘制所需的空间。size 参数是一个constraint ,用于在绘制文本时做为参考。可是,若是绘制完整个文本须要更大的空间,则返回的矩形大小可能比 size 更大。通常,绘制时会采用constraint 提供的宽度,但高度则会根据须要而定。

特殊状况

为了计算文本块的大小,该方法采用默认基线。

若是 NSStringDrawingUsesLineFragmentOrigin未指定,矩形的高度将被忽略,同时使用单线绘制。(因为一个 bug,在 iOS6 中,宽度会被忽略)

兼容性

  • iOS 6.0 之后支持。

声明于

NSStringDrawing.

 

另外,关于参数(NSStringDrawingOptions)options

 

  1. 复制代码
    typedef NS_ENUM(NSInteger, NSStringDrawingOptions) {  
        NSStringDrawingTruncatesLastVisibleLine = 1 << 5, // Truncates and adds the ellipsis character to the last visible line if the text doesn't fit into the bounds specified. Ignored if NSStringDrawingUsesLineFragmentOrigin is not also set. 
        NSStringDrawingUsesLineFragmentOrigin = 1 << 0, // The specified origin is the line fragment origin, not the base line origin 
        NSStringDrawingUsesFontLeading = 1 << 1, // Uses the font leading for calculating line heights 
        NSStringDrawingUsesDeviceMetrics = 1 << 3, // Uses image glyph bounds instead of typographic bounds 
    } NS_ENUM_AVAILABLE_IOS(6_0);  
    复制代码

     

 

NSStringDrawingTruncatesLastVisibleLine:

若是文本内容超出指定的矩形限制,文本将被截去并在最后一个字符后加上省略号。若是没有指定NSStringDrawingUsesLineFragmentOrigin选项,则该选项被忽略。

NSStringDrawingUsesLineFragmentOrigin:

绘制文本时使用 line fragement origin 而不是 baseline origin。

The origin specified when drawing the string is the line fragment origin and not the baseline origin.

NSStringDrawingUsesFontLeading:

计算行高时使用行距。(译者注:字体大小+行间距=行距)

NSStringDrawingUsesDeviceMetrics:

计算布局时使用图元字形(而不是印刷字体)。

Use the image glyph bounds (instead of the typographic bounds) when computing layout.


OS7中出现了新的方法计算UILabel中根据给定的Font以及str计算UILabel的frameSize的方法.本人提供category以下:

UILabel+StringFrame.h

复制代码
复制代码
//
//  UILabel+StringFrame.h
//  LabelHeight
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface UILabel (StringFrame)

- (CGSize)boundingRectWithSize:(CGSize)size;

@end
复制代码
复制代码

UILabel+StringFrame.m

复制代码
按 Ctrl+C 复制代码

//
// UILabel+StringFrame.m
// LabelHeight
//
// Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "UILabel+StringFrame.h"

@implementation UILabel (StringFrame)

- (CGSize)boundingRectWithSize:(CGSize)size { NSDictionary *attribute = @{NSFontAttributeName: self.font}; CGSize retSize = [self.text boundingRectWithSize:size options:\ NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attribute context:nil].size; return retSize; }

相关文章
相关标签/搜索