Пользовательский текстовый атрибут textkit рисует большой прямоугольник, когда он занимает несколько строк

В основном я создаю настраиваемый атрибут для рисования прямоугольника со скругленными углами в моем текстовом подклассе NSLayoutManager с помощью метода drawGlyphsForGlyphRange ниже. Ниже работает как шарм с диапазонами, охватывающими одну строку. Однако, когда диапазон текста занимает две строки, я получаю большой прямоугольник, который рисует атрибут вдоль этих двух строк. Я думаю, что здесь мне следует использовать другой подход, я попробовал nsbackgroundattribute, чтобы нарисовать подсветку, но, к сожалению, я не могу сделать подсветку закругленной прямоугольной, используя это.

Буду признателен за любые указания.

-(void)drawGlyphsForGlyphRange:(NSRange)glyphsToShow atPoint:(CGPoint)origin {

NSTextStorage *textStorage = self.textStorage;
NSRange glyphRange = glyphsToShow;
while (glyphRange.length > 0) {
   NSRange charRange = [self characterRangeForGlyphRange:glyphRange actualGlyphRange:NULL], attributeCharRange, attributeGlyphRange;
   id attribute = [textStorage attribute:IKSpecialHighlightAttributeName atIndex:charRange.location longestEffectiveRange:&attributeCharRange inRange:charRange];

    attributeGlyphRange = [self glyphRangeForCharacterRange:attributeCharRange actualCharacterRange:NULL];

    attributeGlyphRange = NSIntersectionRange(attributeGlyphRange, glyphRange);

    if( attribute != nil ) {



        NSTextContainer *textContainer = self.textContainers[0];

        CGRect boundingRect = [self boundingRectForGlyphRange:attributeGlyphRange inTextContainer:textContainer];





        [[UIColor colorWithRed:221.0/255.0 green:255.0/255.0 blue:0.0/255.0 alpha:1] setFill]; // set rounded rect's bg color



        boundingRect.origin.x += origin.x-3.0;

        boundingRect.origin.y += origin.y+3.0;

        boundingRect.size.width += 6.0;



        UIBezierPath *roundedRect = [UIBezierPath bezierPathWithRoundedRect:boundingRect cornerRadius: 3.0];



        [roundedRect fillWithBlendMode: kCGBlendModeNormal alpha:1.0f];




        [super drawGlyphsForGlyphRange:attributeGlyphRange atPoint:origin];

    }

    else {

        [super drawGlyphsForGlyphRange:glyphsToShow atPoint:origin];

    }

    glyphRange.length = NSMaxRange(glyphRange) - NSMaxRange(attributeGlyphRange);

    glyphRange.location = NSMaxRange(attributeGlyphRange);

}

}


person ilteris    schedule 19.12.2013    source источник
comment
Часть решения находится здесь: stackoverflow.com/questions/20694942/. В основном я использую методы layoutManager -enumerateLineFragmentsForGlyphRange:usingBlock: и enumerateEnclosingRectsForGlyphRange:withinSelectedGlyphRange:inTextContainer:usingBlock: для циклического перемещения по строкам и получения местоположения в поле зрения текста. Однако есть некоторые проблемы.   -  person Myron Slaw    schedule 20.12.2013
comment
работал на меня! Спасибо.   -  person ilteris    schedule 26.12.2013