iOS 不规则排版UILabel示例

2021-10-16  本文已影响0人  楠楠小胖纸

继承自UILabelYQLabel.m文件

#import "QYLabel.h"
#import <CoreText/CoreText.h>


@implementation QYLabel

- (void)drawRect:(CGRect)rect {
    
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetTextMatrix(context, CGAffineTransformIdentity);
    CGContextTranslateCTM(context, 0, self.bounds.size.height);
    CGContextScaleCTM(context, 1, -1);
    
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, NULL, 0, 0);
    CGPathAddLineToPoint(path, NULL, self.frame.size.width - 40, 0);
    CGPathAddLineToPoint(path, NULL, self.frame.size.width - 40, 40);
    CGPathAddLineToPoint(path, NULL, self.frame.size.width, 40);
    CGPathAddLineToPoint(path, NULL, self.frame.size.width, self.frame.size.height);
    CGPathAddLineToPoint(path, NULL, 40, self.frame.size.height);
    CGPathAddLineToPoint(path, NULL, 40, self.frame.size.height - 40);
    CGPathAddLineToPoint(path, NULL, 0, self.frame.size.height - 40);
    CGPathCloseSubpath(path);
    
    CGFloat lineSpacing = 5.0f;
    CGFloat fontSize = 15.0f;
    
    NSMutableParagraphStyle * paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    paragraphStyle.lineSpacing = lineSpacing;
    NSDictionary * dict = @{NSFontAttributeName:[UIFont fontWithName:@"Helvetica" size:fontSize],
                            NSForegroundColorAttributeName:[UIColor redColor],
                            NSParagraphStyleAttributeName:paragraphStyle};
    NSString * string = @"你爱我 我爱你 蜜雪冰城甜蜜蜜 你爱我 我爱你 蜜雪冰城甜蜜蜜 你爱我 我爱你 你爱我 我爱你 蜜雪冰城甜蜜蜜 你爱我 我爱你 蜜雪冰城甜蜜蜜 你爱我 我爱你 蜜雪冰城甜蜜蜜 你爱我 我爱你 你爱我 我爱你 蜜雪冰城甜蜜蜜 你爱我 我爱你 蜜雪冰城甜蜜蜜 你爱我 我爱你 蜜雪冰城甜蜜蜜 你爱我 我爱你 你爱我 我爱你 蜜雪冰城甜蜜蜜 你爱我 我爱你 蜜雪冰城甜蜜蜜 你爱我 我爱你 蜜雪冰城甜蜜蜜 你爱我 我爱你 你爱我 我爱你 蜜雪冰城甜蜜蜜 你爱我 我爱你 蜜雪冰城甜蜜蜜 你爱我 我爱你 蜜雪冰城甜蜜蜜 你爱我 我爱你 你爱我 我爱你 蜜雪冰城甜蜜蜜 你爱我 我爱你 蜜雪冰城甜蜜蜜 你爱我 我爱你 蜜雪冰城甜蜜蜜 你爱我 我爱你 你爱我 我爱你 蜜雪冰城甜蜜蜜";
    NSMutableAttributedString * attStr = [[NSMutableAttributedString alloc] initWithString:string
                                                                                attributes:dict];
    
    CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attStr);
    CTFrameRef frame = CTFramesetterCreateFrame(frameSetter, CFRangeMake(0, attStr.length), path, NULL);
    CTFrameDraw(frame, context);
    
    CFRelease(frame);
    CFRelease(path);
    CFRelease(frameSetter);

}

@end

效果如下:


上一篇 下一篇

猜你喜欢

热点阅读