您的位置:首页 > 移动开发 > IOS开发

Replacement for deprecated sizeWithFont: in iOS 7?

2015-11-06 16:12 501 查看
I believe the function was deprecated because that series of
NSString+UIKit
functions
(
sizewithFont:...
,
etc) were based on the
UIStringDrawing
library,
which wasn't thread safe. If you tried to run them not on the main thread (like any other
UIKit
functionality),
you'll get unpredictable behaviors. In particular, if you ran the function on multiple threads simultaneously, it'll probably crash your app. This is why in iOS 6, they introduced a the
boundingRectWithSize:...
method
for
NSAttributedString
.
This was built on top of the
NSStringDrawing
libraries
and is thread safe.

If you look at the new
NSString
boundingRectWithSize:...
function,
it asks for an attributes array in the same manner as a
NSAttributeString
.
If I had to guess, this new
NSString
function
in iOS 7 is merely a wrapper for the
NSAttributeString
function
from iOS 6.

On that note, if you were only supporting iOS 6 and iOS 7, then I would definitely change all of your
NSString
sizeWithFont:...
to
the
NSAttributeString
boundingRectWithSize
.
It'll save you a lot of headache if you happen to have a weird multi-threading corner case! Here's how I converted
NSString
sizeWithFont:constrainedToSize:
:

What used to be:
NSString *text = ...;
CGFloat width = ...;
UIFont *font = ...;
CGSize size = [text sizeWithFont:font
constrainedToSize:(CGSize){width, CGFLOAT_MAX}];


Can be replaced with:
NSString *text = ...;
CGFloat width = ...;
UIFont *font = ...;
NSAttributedString *attributedText =
[[NSAttributedString alloc] initWithString:text
attributes:@{NSFontAttributeName: font}];
CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX}
options:NSStringDrawingUsesLineFragmentOrigin
context:nil];
CGSize size = rect.size;


Please note the documentation mentions:

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

So to pull out the calculated height or width to be used for sizing views, I would use:
CGFloat height = ceilf(size.height);
CGFloat width  = ceilf(size.width);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: