Нарисуйте цвет фона в прямоугольнике UILabel только там, где мой текст - PullRequest
2 голосов
/ 08 июля 2010

Мне нужно создать пользовательскую UILabel для отображения динамического многострочного текста.Цвет текста белый на черном фоне.Но фон должен быть виден только за текстом, чтобы имитировать эффект выделенной текстовой области.

Я начал с создания подкласса UILabel и переопределения drawTextInRect для создания своих собственных рисунков.

- (void) drawTextInRect:(CGRect)rect
{
 /* do some custom drawings here */

 [super drawTextInRect:rect];
}

До сих пор я не мог придумать, как вычислить границы текста, в которые можно нарисовать мой фон.Кто-нибудь сейчас, как делать такие вещи?Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 09 июля 2010

Хорошо.Теперь после некоторого ввода из stackoverflow я использую этот фрагмент кода, чтобы получить текстовые границы, но он прекрасно работает только с однострочным текстом.

- (void) drawTextInRect:(CGRect)rect
{
    CGFloat lineHeight  = [self.text sizeWithFont:self.font].height;
    CGSize  testSize    = CGSizeMake(320, lineHeight * self.numberOfLines);
    CGSize  textSize    = [self.text sizeWithFont:self.font constrainedToSize:testSize lineBreakMode:self.lineBreakMode];

    //NSLog(@"drawTextInRect lineHeight %f, width %f x height %f", lineHeight, textSize.width, textSize.height);

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);

    CGContextSetRGBFillColor(context, 0.0, 0.0, 0.0, 1.0);
    CGContextAddRect(context, CGRectMake(0, 0, textSize.width, textSize.height));
    CGContextFillPath(context);

    CGContextRestoreGState(context);

    [super drawTextInRect:rect];
}

Если у меня многострочный текст, мне все еще нужен код для вычисления пути.информация о тексте, а не только ограничивающий прямоугольник, чтобы я мог использовать CGContextDrawPath, чтобы нарисовать свой фон.Есть мысли по этому поводу?Спасибо.

0 голосов
/ 08 июля 2010

NSString имеет некоторые дополнения в UIKit, позволяющие вычислять размер, используемый для визуализации строки, с учетом различных параметров.Вы можете использовать эти методы для вычисления размера, необходимого UILabel для визуализации строки, а затем изменить размер UILabel до именно этого размера.Посмотрите в документации метод с именем -sizeWithFont:, все остальные варианты перечислены там.Убедитесь, что вы используете правильный метод, чтобы соответствовать настройке UILabel.

Здесь есть одна оговорка, которая заключается в том, что в iOS 4 есть ошибка, когда эти методы на самом деле возвращают немного другой размер, чем на самом делеиспользуется для рисования (по крайней мере, для системного шрифта на iPhone 4 [например, Helvetica Neue], я не знаю, затрагивает ли эта ошибка какие-либо другие шрифты).К сожалению, единственный обходной путь, о котором я знаю, - это переключиться на Core Text для всего вашего рендеринга текста, поэтому вы можете просто предпочесть жить с этой ошибкой (если она даже затрагивает вас), пока Apple не выпустит обновление программного обеспечения.Эта ошибка влияет на собственные приложения Apple, поэтому существует множество прецедентов, позволяющих не обрабатывать ее.

...