Черные углы на сгруппированных ячейках UITableView только после всплывающих окон навигации - PullRequest
8 голосов
/ 11 мая 2010

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

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

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

альтернативный текст http://new.tinygrab.com/c1f9e8196b4b92e6bb4d3130a7e08974.png альтернативный текст http://new.tinygrab.com/531ee83e42cdeadc78d418d1c5e7c513.png

У меня есть тонны кода, большая часть которых написана здесь .Я пытался настроить все возможное, просматривая документы на предмет применимых изменений, но, по крайней мере, через 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:

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

Ответы [ 3 ]

5 голосов
/ 14 мая 2010

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

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

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

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

  • Убедитесь, что прямоугольник всей ячейки закрашен. Это означает использование того же цвета для хранения ячейки перед рисованием края, как цвет фона таблицы. Если в табличном представлении используется цвет фона по умолчанию, вы можете использовать [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];
}

Конечно, это можно немного оптимизировать:

  • Создайте цветовые массивы один раз.
  • Предоставьте пользовательский установщик для свойства override, которое меняет цвета слоя.
  • Удалите метод display, так как он больше не нужен.
2 голосов
/ 14 мая 2010

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

self.cornerRadius = 12;

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

0 голосов
/ 15 мая 2010

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

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

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

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

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...