NSBackgroundColorAttributeName-подобный атрибут в NSAttributedString на iOS? - PullRequest
12 голосов
/ 15 июля 2011

Я планировал использовать NSAttributedString для выделения частей строк с соответствующим запросом поиска пользователя.Тем не менее, я не могу найти iOS-эквивалент NSBackgroundColorAttributeName - нет kCTBackgroundColorAttributeName.Существует ли такая вещь, подобная тому, как NSForegroundColorAttributeName становится kCTForegroundColorAttributeName?

Ответы [ 2 ]

8 голосов
/ 31 июля 2011

Нет, такого атрибута не существует в Базовом тексте, вам нужно нарисовать свои собственные прямоугольники под текстом, чтобы имитировать его.

По сути, вам нужно выяснить, какой прямоугольник (s) заполнить заданный диапазон в строке.Если вы делаете макет с CTFramesetter, который выдает CTFrame, вам нужно получить его строки и их происхождение, используя CTFrameGetLines и CTFrameGetLineOrigins.

. Затем выполните итерации по линиям и используйте * 1009.* чтобы узнать, какие линии являются частью диапазона, который вы хотите выделить.Чтобы получить прямоугольники для заполнения, используйте CTLineGetTypographicBounds (для высоты) и CTLineGetOffsetForStringIndex (для горизонтального смещения и ширины).

4 голосов
/ 18 октября 2012

NSBackgroundColorAttributeName доступно в iOS 6, и вы можете использовать его следующим образом:

[_attributedText addAttribute: NSBackgroundColorAttributeName value:[UIColor yellowColor] range:textRange];

[_attributedText drawInRect:rect]; 

drawInRect: будет поддерживать NSBackgroundColorAttributeName и все NS * AttributeNames, поддерживаемые iOS 6.

Для CTFrameDraw () не поддерживается цвет фона фона.

Код:

- (void)drawRect:(CGRect)rect {    

    // First draw selection / marked text, then draw text

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);
    CGContextSetTextMatrix(context, CGAffineTransformIdentity);
    CGContextTranslateCTM(context, 0, self.bounds.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);

    [_attributedText drawInRect:rect];

    CGContextRestoreGState(context);

//  CTFrameDraw(_frame, UIGraphicsGetCurrentContext());

}
...