Я планировал использовать 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());
}