2010-01-12 3 views
20

Я добавляю экземпляр UILabel в качестве подзаголовка моего пользовательского UITableViewCell экземпляра contentView.Blurry UILabel как программная подзадача UITableViewCell contentView

Когда я выбираю ячейку, строка подсвечивается синим цветом, за исключением фона метки. Текст ярлыка острый.

Когда я установил ярлык и содержимое backgroundColor на [UIColor clearColor], текст ярлыка становится размытым.

Как установить цвет фона метки, чтобы он был прозрачным, чтобы подсветка строки прошла, сохраняя при этом текст ярлыка четким?

Одно из предложений, которое я прочитал в другом месте, было round значения метки frame, но это не имело никакого эффекта.

КОД

Вот отрывок из -setNeedsLayout метода моего пользовательские UITableViewCell подвида в:

UILabel *_objectTitleLabel = [[UILabel alloc] initWithFrame:CGRectNull]; 
_objectTitleLabel.text = [self.awsObject cleanedKey]; 
_objectTitleLabel.font = [UIAppDelegate defaultObjectLabelFont]; 
_objectTitleLabel.highlightedTextColor = [UIColor clearColor]; //[UIAppDelegate defaultLabelShadowTint]; 
_objectTitleLabel.backgroundColor = [UIColor clearColor]; //[UIAppDelegate defaultWidgetBackgroundTint]; 
_objectTitleLabel.frame = CGRectMake(
     kCellImageViewWidth + 2.0 * self.indentationWidth, 
     0.5 * (self.tableView.rowHeight - 1.5 * kCellLabelHeight) + kCellTitleYPositionNudge, 
     contentViewWidth, 
     kCellLabelHeight 
); 
_objectTitleLabel.frame = CGRectIntegral(_objectTitleLabel.frame); 
_objectTitleLabel.tag = kObjectTableViewCellTitleSubviewType; 
//NSLog(@"_objectTitleLabel: %@", NSStringFromCGRect(_objectTitleLabel.frame)); 
[self.contentView addSubview:_objectTitleLabel]; 
[_objectTitleLabel release], _objectTitleLabel = nil; 

... 

self.contentView.backgroundColor = [UIAppDelegate defaultWidgetBackgroundTint]; 
self.contentView.clearsContextBeforeDrawing = YES; 
self.contentView.autoresizesSubviews = YES; 
self.contentView.clipsToBounds = YES; 
self.contentView.contentMode = UIViewContentModeRedraw; 
+0

Вы можете отправить исходный код? –

+0

См. Дополнительные фрагменты кода. –

ответ

35

Проблема - это субпиксельная рендеринг, которая возникает, когда ваше начало (которое является значением поплавка) имеет ненулевой дробный компонент. Раунд до ближайшего целого номера, и все должно быть хорошо.

+0

Я уже устанавливаю кадр на целочисленные значения: '_objectTitleLabel.frame = CGRectIntegral (_objectTitleLabel.frame)' –

+1

И вы все еще видя проблему с размытым рендерингом? Как насчет вашего родительского представления (ов) - они слишком расположены целиком? –

+4

Будьте осторожны: эта проблема возникает также при настройке «центра» вида с нечетной шириной и/или высотой. – mvds

2

Я столкнулся с этой проблемой я сегодня, и где-то читал, что нецелые значения координат и размер кадра UILabel может вызвать это (я знаю, что они плавающие, но вы знаете, что я имею в виду). Там надо быть более элегантное решение, но это быстро хак, кажется, решить эту проблему для меня:

self.valueLabel.frame = CGRectMake((int) frame.origin.x, (int) frame.origin.y, (int) frame.size.width, (int) frame.size.height); 

Если найти лучшее решение, пожалуйста, дайте мне знать, я хотел бы заменить этот хак с чем-то более вкусным.

+0

Я уже устанавливаю кадр на целочисленные значения: '_objectTitleLabel.frame = CGRectIntegral (_objectTitleLabel.frame)' –

1

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

Чтобы проверить, является ли это причиной эффекта, который вы видите, я бы предложил проверить/распечатать все данные, которые у вас есть о размере/местоположении меток после его создания, а также проверить метод делегата tableView: heightForRowAtIndexPath: это вставьте в высоту ячейки, которую вы возвращаете для ячейки. Надеюсь, это поможет в вашем случае.

7

ОК, нахожу проблему, убедитесь, что координаты вашего родительского вида округлены.

1

Использование round(); Функции C предоставляются по какой-либо причине.

#define roundCGRectValues (frame) \ 
frame = CGRectMake(round(frame.origin.x),round(frame.origin.y),round(frame.size.width),round(frame.size.height)); 

Все что вам нужно.

+2

Как уже упоминалось, я добавил '_objectTitleLabel.frame = CGRectIntegral (_objectTitleLabel.frame);' не действует. –

1

Вызывается ли -setNeedsLayout даже для выделенных повторно используемых ячеек? Если это так, ячейка уже добавит метку к представлению содержимого, и вы будете рисовать ее дважды, делая ее размытой.Вы можете нерационально решить эту проблему путем удаления всех подвидов представления содержимого, прежде чем добавить подвид:

for (UIView *subview in [[self contentView] subviews]) { 
    [subview removeFromSuperview]; 
} 

Лучшим решением было бы обеспечить свойства на мобильный подкласса позволяет изменять содержимое повторно использовать ячейки как- а не перестраивать свою иерархию взглядов с нуля.

2

Другая причина искаженного/размытого текста - повторное использование ячейки. Если вы отключили повторное использование ячейки повторного использования, тогда она может перерисовываться с различными измерениями где-то еще и снова повторно использоваться, когда она попадает в вашу ячейку с искаженным текстом.

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

8

В моем случае, установленным shouldRasterize = YES на CGLayer в представлении, содержащем UILabel, был виновником. Удаление этой строки сделало текст приятным и четким.

+0

Исправить. Но если вы используете 'UITableViewCell', это может привести к дерзости в свитке. В этом случае установите масштаб растеризации. –

+0

Это хороший совет. Я закончил делать полный пользовательский рисунок с Quartz в моей ячейке tableview, и теперь он молниеносно! –

+0

Это сработало для меня !!! СПАСИБО БОЛЬШОЕ!! – reidisaki

2

shouldRasterize до YES может вводить размытость. Установите масштаб растеризации, и это должно устранить размытость. [self.layer setRasterizationScale:[[UIScreen mainScreen] scale]];

Смежные вопросы