2010-07-14 2 views
7

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

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

Thanx заранее.

ответ

11

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

Update

Это пример код для представления чертежа простого текста (Обратите внимание, что нет коды управления памяти здесь).

@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 

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

+0

Я уже сделал это, но это не помогает. Сама документация не дает много информации о CTRunDelegate. если у вас есть образец кода для CTRunDelegate, это будет очень полезно. – tek3

+0

Я получил ответ, прежде чем увидел ваш ответ, но вы приложили усилия, чтобы дать мне правильный ответ, так что эта щедрость идет к вам. Thanx много для вашего ответа. – tek3

+0

Привет Мо, мне нужна дополнительная помощь от вас для моего приложения. Вы хотите помочь мне? – tek3

Смежные вопросы