Подтвердить что ты не робот

Размытие UILabel как программное подчинение UITableViewCell contentView

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

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

Когда я устанавливаю свойство backgroundColor метки и содержимого backgroundColor, текст ярлыка становится размытым.

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

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

CODE

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

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;
4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

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

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

Ответ 9

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

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

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