Я не графический эксперт, но мне так или иначе удалось сделать некоторый красивый пользовательский сгруппированный UITableViewCells путем установки фонового представления на backgroundView с некоторым кодом CG. Максимум в 3.1.3 всего SDK (возможно, 3.2... Я не протестировал на iPad), это работало отлично, но я думаю, что более свежий SDK представил изменение в способе, которым графика кэшируется вне экрана.
После первого рендеринга все является большим: рисунок прекрасен, и углы прозрачны. Если я продвигаю несколько контроллеров представления на стопке навигации и возвращаюсь, существуют теперь черные углы, которые появляются в представлениях:
(источник: tinygrab.com)
(источник: tinygrab.com)
У меня есть тонны кода, большая часть которого описана здесь. Я попытался настроить в меру своей способности, смотря на документы для применимых изменений, но по крайней мере после 8 часов в я все еще не могу найти то, что могло бы вызвать это. Я попытался установить каждое представление, о котором я могу думать, чтобы быть backgroundColor=clearColor
и opaque=NO
Что еще я пропускаю? Какие-либо подсказки по отладке?
У меня есть некоторый код отладки в viewDidAppear
это печатает backgroundColor и описание класса всех подпредставлений.
- (void)debugView:(UIView *)view {
DebugLog(@"%@ - %@", view.backgroundColor, [[view class] description]);
for (UIView* child in view.subviews) {
[self debugView:child];
}
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[DownloadController.networkQueue setSuspended:NO];
for (TTTableViewCell *cell in [self.tableView visibleCells]) {
[cell debugView:cell];
}
}
С этим кодом я осматриваю backgroundColor настройки представлений ячейки о первой загрузке, когда это прекрасно, и с другой стороны после возвращения. Существуют некоторые различия, но все цвета все еще выбраны, чтобы быть ясными. Это приводит меня полагать, что проблема под UITableViewCell.
Я создал приложение простой выборки для выделения проблемы.
Я протестировал образец приложения и могу воспроизвести черные углы выдают.
После некоторых экспериментов выяснилось, что проблема с черными углами связана с кэшированием слоев, используемых для визуализации табличного представления. По-видимому, важна геометрия слоя ячейки:
Чтобы избавиться от черных углов, вы можете:
[UIColor groupTableViewBackgroundColor] .CGColor
как цвет заливки; это цвет, основанный на узоре, и он соответствует ориентации устройства (да); но картина не идеально совмещена с фоном (блин). CGImage
, установку ее в качестве содержимого слоя и назначение слоя маски слою ячейки. Не уверен в производительности. Надеюсь, это немного поможет.
Обновление
После нескольких неудачных попыток я отказался от идеи маски, потому что она была слишком неуклюжей.
Я перечитал код слоя ячейки и нашел способ простым способом удалить черные углы. Основная идея состоит в том, что CAGradientLayer
полностью прозрачен, только если его градиентные цвета ясны. Используя следующий метод display
, черные углы исчезли (как на симуляторе, так и на устройстве):
- (void)display {
if (_override) {
self.colors =
[NSArray arrayWithObjects:
(id)[UIColor colorWithRed:colorComponents[0] green:colorComponents[1] blue:colorComponents[2] alpha:colorComponents[3]].CGColor,
(id)[UIColor colorWithRed:colorComponents[4] green:colorComponents[5] blue:colorComponents[6] alpha:colorComponents[7]].CGColor,
nil];
} else {
self.colors =
[NSArray arrayWithObjects:
(id)[UIColor clearColor].CGColor,
(id)[UIColor clearColor].CGColor,
nil];
}
[super display];
}
Конечно, это можно немного оптимизировать:
переопределения
, которое изменяет цвета слоя. display
, так как он больше не нужен. Я экспериментировал с вашим примером кода, используя OS3.2 на симуляторе, и он определенно показывает тот же симптом. Я попробовал несколько вещей и нашел это исправление:
self.cornerRadius = 12;
Добавьте это в UAGradientCellBackgroundLayer
, в метод init
.
Выбрасывая это (возможно, это поможет), добавление следующего параметра к cellForRowAtIndexPath дает интересный эффект:
cell.backgroundView.alpha = 0.4;
cell.selectedBackgroundView.alpha = 0.4;
Не все ячейки имеют черный фон. Изменение альфы, похоже, изменяет вероятность того, что любая ячейка будет неправильно отображаться. alpha = 1.0 гарантирует черный фон, в то время как любое меньшее значение уменьшает вероятность этого эффекта.
Черный фон также исчезает, так что я уверен, что вы все знали, но да, это связано с UAGradientCellBackgroundView.
Удачи!