學習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; }

相關文章
相關標籤/搜索