Я планировал использовать NSAttributedString, чтобы выделить части строк с соответствующим запросом поиска пользователя. Однако я не могу найти эквивалент iOS NSBackgroundColorAttributeName -there kCTBackgroundColorAttributeName. Существует ли такая вещь, подобно тому, как NSForegroundColorAttributeName становится kCTForegroundColorAttributeName?
NSBackgroundColorAttributeName-подобный атрибут в NSAttributedString на iOS?
Ответ 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());
}