Расплывчатый UILabel как программное подпредставление о UITableViewCell contentView

Я добавляю a UILabel случай как подточка зрения моего обычая UITableViewCell случай contentView.

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

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

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

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

КОДЕКС

Вот отрывок моего обычая UITableViewCell подпредставление -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;
20
задан Alex Reynolds 12 January 2010 в 08:19
поделиться

6 ответов

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

35
ответ дан 29 November 2019 в 22:54
поделиться

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

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

1
ответ дан 29 November 2019 в 22:54
поделиться

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

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

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

2
ответ дан 29 November 2019 в 22:54
поделиться

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

7
ответ дан 29 November 2019 в 22:54
поделиться

Use round (); Функции C предоставляются не просто так.

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

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

1
ответ дан 29 November 2019 в 22:54
поделиться

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

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

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

1
ответ дан 29 November 2019 в 22:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: