Подтвердить что ты не робот

NSBackgroundColorAttributeName-подобный атрибут в NSAttributedString на iOS?

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

4b9b3361

Ответ 1

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

В принципе, вам нужно будет выяснить, какие прямоугольники для заполнения заданного диапазона в строке. Если вы делаете свой макет с CTFramesetter, который создает CTFrame, вам нужно получить его строки и их происхождение с помощью CTFrameGetLines и CTFrameGetLineOrigins.

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

Ответ 2

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());

}