How to use CTRunDelegate in iPad?

前端 未结 1 1590
南旧
南旧 2021-02-02 03:23

I am a developing an iPad application in which i have to use CTRunDelegate. I have defined all the the callbacks that are required viz CTRunDelegateGetAscentC

相关标签:
1条回答
  • 2021-02-02 04:15

    You should add your run delegate as an attribute for a range of characters in your attributed string. See Core Text String Attributes. When drawing, Core Text will call your callbacks to get the sizing of that characters.

    Update

    This is a sample code for a view drawing a simple text (Note that there's no memory management code here).

    @implementation View
    
    /* Callbacks */
    void MyDeallocationCallback( void* refCon ){
    
    }
    CGFloat MyGetAscentCallback( void *refCon ){
        return 10.0;
    }
    CGFloat MyGetDescentCallback( void *refCon ){
        return 4.0;
    }
    CGFloat MyGetWidthCallback( void* refCon ){
        return 125;
    }
    
    - (void)drawRect:(CGRect)rect {
        // create an attributed string
        NSMutableAttributedString * attrString = [[NSMutableAttributedString alloc]                 initWithString:@"This is my delegate space"];
    
        // create the delegate
        CTRunDelegateCallbacks callbacks;
        callbacks.version = kCTRunDelegateVersion1;
        callbacks.dealloc = MyDeallocationCallback;
        callbacks.getAscent = MyGetAscentCallback;
        callbacks.getDescent = MyGetDescentCallback;
        callbacks.getWidth = MyGetWidthCallback;
        CTRunDelegateRef delegate = CTRunDelegateCreate(&callbacks, NULL);
    
        // set the delegate as an attribute
        CFAttributedStringSetAttribute((CFMutableAttributedStringRef)attrString, CFRangeMake(19, 1), kCTRunDelegateAttributeName, delegate);
    
        // create a frame and draw the text
        CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attrString);
        CGMutablePathRef path = CGPathCreateMutable();
        CGPathAddRect(path, NULL, rect);
        CTFrameRef frame = CTFramesetterCreateFrame(frameSetter, CFRangeMake(0, attrString.length), path, NULL);
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSetTextMatrix(context, CGAffineTransformIdentity);
        CGContextSetTextPosition(context, 0.0, 0.0);
        CTFrameDraw(frame, context);
    }
    
    @end
    

    The size of the space character between "delegate" and "space" in the text are controlled by the run delegate.

    0 讨论(0)
提交回复
热议问题