Как использовать CTRunDelegate в iPad? - PullRequest
7 голосов
/ 14 июля 2010

Я разрабатываю приложение для iPad, в котором мне нужно использовать CTRunDelegate. Я определил все обратные вызовы, которые необходимы, а именно CTRunDelegateGetAscentCallback, CTRunDelegateGetDescentCallback, CTRunDelegateGetWidthCallback. Я не знаю, как использовать CTRunDelegateRef объект, который я создаю. Сейчас происходит то, что мои обратные вызовы не получают вызова.

Любые указатели в этом отношении будут высоко оценены.

Спасибо заранее.

1 Ответ

11 голосов
/ 22 июля 2010

Вы должны добавить свой делегат выполнения в качестве атрибута для диапазона символов в вашей приписанной строке.См. Базовые текстовые строковые атрибуты .При рисовании Core Text будет вызывать ваши обратные вызовы, чтобы получить размеры этих символов.

Обновление

Это пример кода для представления, рисующего простой текст (Примечание.что здесь нет кода управления памятью).

@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

Размер символа пробела между «делегатом» и «пробелом» в тексте контролируется делегатом выполнения.

...