Черные углы на сгруппированном UITableViewCells только после навигации появляются

Я не графический эксперт, но мне так или иначе удалось сделать некоторый красивый пользовательский сгруппированный UITableViewCells путем установки фонового представления на backgroundView с некоторым кодом CG. Максимум в 3.1.3 всего SDK (возможно, 3.2... Я не протестировал на iPad), это работало отлично, но я думаю, что более свежий SDK представил изменение в способе, которым графика кэшируется вне экрана.

После первого рендеринга все является большим: рисунок прекрасен, и углы прозрачны. Если я продвигаю несколько контроллеров представления на стопке навигации и возвращаюсь, существуют теперь черные углы, которые появляются в представлениях:

ПРЕЖДЕ && ПОСЛЕ

alt text
(источник: tinygrab.com)
   alt text
(источник: 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.

ОБНОВЛЕНИЕ 2:

Я создал приложение простой выборки для выделения проблемы.

8
задан Glorfindel 26 July 2019 в 03:09
поделиться

3 ответа

Я протестировал образец приложения и могу воспроизвести черные углы выдают.

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

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

Чтобы избавиться от черных углов, вы можете:

  • Убедитесь, что весь прямоугольник ячейки закрашен. Это означает использование того же цвета для заполнения ячейки перед рисованием края, что и цвет фона табличного представления. Если ваше tableview использует цвет фона по умолчанию, вы можете использовать [UIColor groupTableViewBackgroundColor] .CGColor как цвет заливки; это цвет, основанный на узоре, и он соответствует ориентации устройства (да); но картина не идеально совмещена с фоном (блин).
  • Используйте маску CALayer на слое ячейки.Это подразумевает создание маски 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 , так как он больше не нужен.
5
ответ дан 5 December 2019 в 21:17
поделиться

Я экспериментировал с вашим примером кода, используя OS3.2 на симуляторе, и он определенно показывает тот же симптом. Я попробовал несколько вещей и нашел это исправление:

self.cornerRadius = 12;

Добавьте это в UAGradientCellBackgroundLayer , в метод init .

2
ответ дан 5 December 2019 в 21:17
поделиться

Выбрасывая это (возможно, это поможет), добавление следующего параметра к cellForRowAtIndexPath дает интересный эффект:

cell.backgroundView.alpha = 0.4;
cell.selectedBackgroundView.alpha = 0.4;

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

Черный фон также исчезает, так что я уверен, что вы все знали, но да, это связано с UAGradientCellBackgroundView.

Удачи!

0
ответ дан 5 December 2019 в 21:17
поделиться
Другие вопросы по тегам:

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