Skip to content

Instantly share code, notes, and snippets.

@darcyliu
Created October 29, 2014 06:14
Show Gist options
  • Save darcyliu/117d66bae61b411813a8 to your computer and use it in GitHub Desktop.
Save darcyliu/117d66bae61b411813a8 to your computer and use it in GitHub Desktop.
text height calculation
size: {102.804, 486.74399999999957}
rect: {{0, 0}, {102.804, 486.74399999999957}}
suggestedSize: {98.6953125, 480}
rect: {{0, 0}, {100, 487}}
NSString *text = @"Wikipedia (Listeni/ˌwɪkɨˈpiːdi.ə/ or Listeni/ˌwɪkiˈpiːdi.ə/ wik-i-pee-dee-ə) is a multilingual, web-based, free-content encyclopedia project supported by the Wikimedia Foundation and based on an openly editable model. The name \"Wikipedia\" is a portmanteau of the words wiki (a technology for creating collaborative websites, from the Hawaiian word wiki, meaning \"quick\") and encyclopedia. Wikipedia's articles provide links designed to guide the user to related pages with additional information.";
UIFont *font = [UIFont systemFontOfSize:12];
CGFloat width = 100;
{
CGSize size = [text sizeWithFont:font constrainedToSize:CGSizeMake(width, CGFLOAT_MAX)];
NSLog(@"size: %@",NSStringFromCGSize(size));
}
{
CGRect rect = [text boundingRectWithSize:CGSizeMake(width, CGFLOAT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:font}
context:nil];
NSLog(@"rect: %@",NSStringFromCGRect(rect));
}
{
// http://stackoverflow.com/questions/19377421/ctframesettersuggestframesizewithconstraints-with-clipping-attributes-returning
CFRange fitCFRange = CFRangeMake(0,0);
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:text];
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)(attributedString));
CFDictionaryRef frameAttributes = (__bridge CFDictionaryRef)@{
(id)kCTFrameProgressionAttributeName : @(kCTFrameProgressionTopToBottom),
(id)kCTFramePathWidthAttributeName:@(0),
(id)kCTFrameClippingPathsAttributeName:@[]
//(id)kCTFramePathFillRuleAttributeName:@(kCTFramePathFillEvenOdd)
//(id)kCTFramePathClippingPathAttributeName:
};
CGSize suggestedSize = CTFramesetterSuggestFrameSizeWithConstraints(framesetter,
CFRangeMake(0, attributedString.length),
frameAttributes,
CGSizeMake(width,CGFLOAT_MAX),
&fitCFRange);
CFRelease(framesetter);
NSLog(@"suggestedSize: %@",NSStringFromCGSize(suggestedSize));
}
{
UILabel *toolLabel = [[UILabel alloc] initWithFrame:CGRectZero];
toolLabel.font = font;
toolLabel.numberOfLines = 0;
toolLabel.adjustsFontSizeToFitWidth = YES;
toolLabel.text = text;
CGRect rect = [toolLabel textRectForBounds:CGRectMake(0, 0, width, CGFLOAT_MAX) limitedToNumberOfLines:0];
NSLog(@"rect: %@",NSStringFromCGRect(rect));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment