YYAsyncLayer icon indicating copy to clipboard operation
YYAsyncLayer copied to clipboard

关于CreateCTLines()函数的疑问

Open wave113 opened this issue 6 years ago • 3 comments

在使用例子的介绍里, 有一个名为CreateCTLines()的C函数报错, 这个函数的具体实现能给post出来吗?

wave113 avatar Aug 09 '18 06:08 wave113

  • (YYAsyncLayerDisplayTask *)newAsyncDisplayTask {

    NSString *text = _text; UIFont *font = _font;

    YYAsyncLayerDisplayTask *task = [YYAsyncLayerDisplayTask new]; task.willDisplay = ^(CALayer *layer) {

    };

    task.display = ^(CGContextRef context, CGSize size, BOOL(^isCancelled)(void)) { if (isCancelled()) return; //在这里由于绘制文字会颠倒 [[NSOperationQueue mainQueue] addOperationWithBlock:^{ CGContextTranslateCTM(context, 0, self.bounds.size.height); CGContextScaleCTM(context, 1.0, -1.0); }]; NSAttributedString* str = [[NSAttributedString alloc] initWithString:text attributes:@{NSFontAttributeName:_font}]; CGContextSetTextPosition(context, 0, font.pointSize); CTLineRef line = CTLineCreateWithAttributedString((__bridge CFAttributedStringRef)str); CTLineDraw(line, context); };

    task.didDisplay = ^(CALayer *layer, BOOL finished) { if (finished) { // finished } else { // cancelled } };

    return task; }

Bintong avatar Mar 06 '19 06:03 Bintong

you can also try

BoxDengJZ avatar Jul 19 '22 05:07 BoxDengJZ

NSString *text = _text;
    UIFont *fontX = _font;
    
    YYAsyncLayerDisplayTask *task = [YYAsyncLayerDisplayTask new];
    task.willDisplay = ^(CALayer *layer) {
        //...
    };
    
    CGFloat h_h = self.bounds.size.height;
    CGFloat w_w = self.bounds.size.width;
    task.display = ^(CGContextRef context, CGSize size, BOOL(^isCancelled)(void)) {
        if (isCancelled()) return;
        //在这里由于绘制文字会颠倒
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            CGContextSetTextMatrix(context, CGAffineTransformIdentity);
            CGContextTranslateCTM(context, 0, h_h);
            CGContextScaleCTM(context, 1.0, -1.0);
        }];
        NSAttributedString* str = [[NSAttributedString alloc] initWithString:text attributes:@{NSFontAttributeName: fontX, NSForegroundColorAttributeName: UIColor.blueColor}];
        CTFramesetterRef ref = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)str);
        CGPathRef path = CGPathCreateWithRect(CGRectMake(0, 0, w_w, 3000), nil);
        CTFrameRef pic = CTFramesetterCreateFrame(ref, CFRangeMake(0, 0), path, nil);
        CFArrayRef arr = CTFrameGetLines(pic);
        NSArray *array = (__bridge NSArray*)arr;
        int i = 0;
        int cnt = (int)array.count;
        CGPoint originsArray[cnt];
        CTFrameGetLineOrigins(pic, CFRangeMake(0, 0), originsArray);
        CGFloat y_y = h_h - 60;
        while (i < cnt) {
            NSLog(@"%f", originsArray[i].y);
            CTLineRef line = (__bridge CTLineRef)(array[i]);
            CGContextSetTextPosition(context, 0, y_y - i * 30);
            CTLineDraw(line, context);
            i += 1;
        }
    };
    

BoxDengJZ avatar Jul 19 '22 05:07 BoxDengJZ