Skip to content

Instantly share code, notes, and snippets.

@darcyliu
Created December 29, 2013 17:48
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save darcyliu/8172847 to your computer and use it in GitHub Desktop.
Save darcyliu/8172847 to your computer and use it in GitHub Desktop.
Manual Line Breaking
CGContextRef context = UIGraphicsGetCurrentContext();
// // Flip the coordinate system
// CGContextSetTextMatrix(context, CGAffineTransformIdentity);
// CGContextTranslateCTM(context, 0, self.bounds.size.height);
// CGContextScaleCTM(context, 1.0, -1.0);
UIFont *customFont = [UIFont systemFontOfSize:20];
CTFontRef font = CTFontCreateWithName((CFStringRef)customFont.fontName, 20, NULL);
NSDictionary *attrs = @{(NSString *)kCTFontAttributeName: (__bridge id)font,
(NSString *)kCTForegroundColorAttributeName: (__bridge id)[UIColor blueColor].CGColor,
(NSString *)kCTUnderlineStyleAttributeName: @(NSUnderlineStyleSingle),
};
// Make an attributed string
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:@"Hello CoreText!" attributes:attrs];
CFAttributedStringRef attributedStringRef = (CFAttributedStringRef)attributedString;
CTTypesetterRef typesetter = CTTypesetterCreateWithAttributedString(attributedStringRef);
CFIndex start = 0;
double width = CGRectGetWidth(self.bounds);
double height = CGRectGetHeight(self.bounds);
CFIndex stringLength = CFAttributedStringGetLength(attributedStringRef);
CGPoint textPosition = CGPointMake(0, height);
// this lineHeight may not equal customFont.lineHeight
// if you need line gap, you should control it by yourself
CGFloat lineHeight = CTFontGetAscent(font) + fabs(CTFontGetDescent(font)) + CTFontGetLeading(font);
while (start<stringLength) {
CFIndex count = CTTypesetterSuggestClusterBreak(typesetter, start, width);
CTLineRef line = CTTypesetterCreateLine(typesetter, CFRangeMake(start, count));
// Get the offset needed to center the line.
float flush = 0.5; // 0,left; 0.5,center; 1,right
double penOffset = CTLineGetPenOffsetForFlush(line, flush, width);
// Move the given text drawing position by the calculated offset and draw the line.
CGContextSetTextPosition(context, textPosition.x + penOffset, textPosition.y - lineHeight);
CTLineDraw(line, context);
start += count;
textPosition.y -= lineHeight;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment