Как получить UIView, который отображает текст, который ведет себя как UILabel при изменении границ? - PullRequest
3 голосов
/ 16 октября 2010

У меня есть UIView, в котором мне нужно рисовать текст в drawRect:

- (void)drawRect:(CGRect)rect {
    ...
    [@"some text" drawAtPoint:somePoint withFont:someFont];
    ...
}

Поскольку текст требует специального форматирования, я не могу просто использовать UILabel.

Выглядит нормально, пока я не поверну устройство. Затем размер моего пользовательского UIView изменяется (в методе layoutSubviews родительского представления), и текст растягивается в одном направлении и сжимается в другом.

Когда я заменяю свое представление на UILabel, текст всегда выглядит великолепно, даже когда границы представления меняются.

Как мне заставить мой взгляд проявлять то же поведение, что и UILabel?

Некоторые вещи, которые я изучил, но пока не достигли успеха:

  • Установите для уровня представления представленияDisplayOnBoundsChange значение YES.
  • Установить представление содержимого Stretch на CGRectZero.
  • Вызовите setNeedsDisplay в макете моего представления Subviews.

Может быть, я не делаю одну из этих вещей правильно. Кто-нибудь еще сталкивался с этим?

Обновление: Как рекомендовано в ответе Джеймса Хаддлстона, я установил для свойства contentMode представления UIViewContentModeRedraw, что помогло мне в этом разобраться. Текст теперь отображается правильно в конце анимации. Однако в начале анимации текст сжимается / растягивается, чтобы соответствовать конечным размерам, а затем становится незакрепленным / растянутым в течение анимации. Это не относится к UILabel.

Ответы [ 4 ]

5 голосов
/ 16 октября 2010

Попробуйте установить для свойства contentMode вашего просмотра значение UIViewContentModeRedraw.

2 голосов
/ 04 января 2011

Кажется, это работает нормально:

self.contentMode = UIViewContentModeRedraw;
self.contentStretch = CGRectMake(1, 1, 0.5, 0.5);

А затем убедитесь, что нижний правый пиксель соответствует цвету фона.Для этого я поместил один пиксель отступа вокруг содержимого представления.Кажется, у UILabel нет ограничения в один пиксель, поэтому он должен делать что-то другое.Но, насколько я могу судить, это имеет тот же эффект.

1 голос
/ 04 января 2011

Использование UIWebView

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

1 голос
/ 04 января 2011

Существует некоторый исходный код, созданный Кевином Баллардом, который называется FontLabel. ( code.google.com )

Хорошо, что это подклассы UILabel, и вы можете использовать свой собственный шрифт;)

// РЕДАКТИРОВАТЬ: хорошо, хорошо, как было сказано, я обновлю свой ответ, чтобы рекомендовать создание подкласса UILabel "to get all the UILabel goodness" ^^

...