UILabel textRectForBounds не действует при попытке создать поле

Я пытаюсь сделать отступ для текста в UILabel, чтобы оставить поле вокруг текста, показывающее цвет фона. Следуя предложению здесь, я переопределил textRectForBounds:limitedToNumberOfLines: следующим образом:

- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines
{
    CGRect intermediate = CGRectMake(bounds.origin.x+MARGIN,bounds.origin.y+MARGIN,bounds.size.width-2*MARGIN,bounds.size.height-2*MARGIN);
    return [super textRectForBounds:intermediate limitedToNumberOfLines:numberOfLines];
}

Но что бы я ни делал, текст оказывается плотно прижатым к левой границе прямоугольника. Кажется, что рисунок игнорирует исходную часть возвращаемого CGRect (хотя, похоже, он учитывает часть ширины, как если бы я уменьшал ширину промежуточного значения, например, до bounds.size.width-200, прямоугольник, который возвращает textRectForBounds, достаточно узок, и текст рисуется в длинной тощей колонке).

Итак: что еще мне нужно сделать с UILabel, чтобы рисунок учитывал origin.x и origin.y textForRectBounds-returned-rect? Я бы предпочел не переопределять UILabel drawTextInRect, если я могу помочь.

Обновление: это было давно, и я не могу точно вспомнить, почему другой вопрос не сработал для меня. Я полагаю, это потому, что я пытался создать UILabel с несколькими строками, а решение здесь не помогло. не работает в этом случае.


person damian    schedule 05.02.2011    source источник
comment
Вы пытались вернуть intermediate напрямую?   -  person Jeff Kelley    schedule 05.02.2011
comment
да, но без разницы.   -  person damian    schedule 05.02.2011


Ответы (2)


Я думаю, вы должны переопределить как textRectForBounds:limitedToNumberOfLines:, так и drawTextInRect: следующим образом:

- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines
{
    return CGRectInset(bounds, MARGIN, MARGIN);
}

- (void)drawTextInRect:(CGRect)rect
{
    [super drawTextInRect: CGRectInset(self.bounds, MARGIN, MARGIN)];
}
person Costique    schedule 05.02.2011
comment
Спасибо, это сработало (более или менее): мне пришлось немного изменить ширину прямоугольника, чтобы все работало правильно с несколькими строками, но в конце концов я заработал. - person damian; 06.02.2011
comment
Если вы сделаете это (чтобы соответствовать UITextView), вы также можете переопределить sizeThatFits следующим образом: - (CGSize)sizeThatFits:(CGSize)size { CGSize fSize = [super sizeThatFits:size]; fSize.width += 2* MARGIN; fSIze.height += 2 * ПОЛЯ; вернуть размер; } - person Arie Litovsky; 01.09.2012
comment
У меня не работает, до сих пор не звонят. - person Iulian Onofrei; 31.08.2017

Посмотрите документацию, может кому поможет. вызовы super могут не возвращать значения, которые вы предполагаете.

Вы не должны вызывать этот метод напрямую. Этот метод должен быть переопределен только подклассами, которые хотят изменить ограничивающий прямоугольник получателя перед выполнением любых других вычислений. Используйте значение параметра numberOfLines, чтобы ограничить высоту возвращаемого прямоугольника указанным количеством строк текста. Чтобы вызвать этот метод, необходимо предварительно вызвать метод sizeToFit или sizeThatFits:. Обратите внимание, что метки в объектах UITableViewCell имеют размер на основе размеров ячейки, а не запрошенного размера. Реализация этого метода по умолчанию возвращает исходный прямоугольник границ.

Удачи!

person Pacu    schedule 05.02.2011
comment
На самом деле документация неверна с limitedToNumberOfLines:0. Переданный в bounds имеет height, который выглядит как INT_MAX_VALUE или что-то в этом роде, и реализация по умолчанию, кажется, уменьшает его до прямоугольника, достаточно высокого, чтобы соответствовать тексту. - person damian; 06.02.2011