UIView с CATransform3D внутри UITableViewCell = прерывистая прокрутка - PullRequest
4 голосов
/ 14 сентября 2011

Я использую пользовательский UITableViewCell , в который помещаю подкласс UIView (в пределах contentView, естественно). UIView , о котором идет речь, отображает стрелку направления и две строки вспомогательного текста.

Стрелка отображается с помощью слоя с фоновым цветом и маски в форме стрелки.Цвет фона меняется на одну из двух возможностей в зависимости от направления, на которое указывает стрелка.

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

    // Update layer BG color, then ...

    [UIView setAnimationBeginsFromCurrentState:YES];
    CATransform3D transform = CATransform3DMakeRotation(DegreesToRadians(locationDirection), 0, 0, 1);
    _arrowLayer.transform = transform;

(nb: _arrowLayer только для внутреннего использования и не отображается через свойство.)

В UIView также есть свойство для установки информации, используемой для создания вспомогательного текста.Когда это изменяется, вызывается setNeedsDisplay, метод drawRect: производит вычисления и выводит результирующий текст.

Это все хорошо.Тем не менее, есть одна серьезная проблема Я сталкиваюсь с:

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

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

Я надеюсь, что я просто делаю фундаментальную ошибку (Не используйте drawRect:? Преобразование выполняется каким-либо другим способом? Ничего из вышеперечисленного?)

Спасибо взаранее за любые подсказки / советы!

ОБНОВЛЕНИЕ 4 октября 2011 г .: Я попытался установить UITableViewController смотреть UIScrollViewDelegate (согласно UIScrollView Руководство по программированию), когда при запуске / остановке прокрутки каждый вид стрелки со стрелкой запрашивает своего делегата (в данном случае Table VC), можно ли анимировать.Это тоже мало помогает.Если анимация идет, нам не повезло.Возможно, NSNotification в порядке, при этом стрелка направления ищет определенное уведомление.(Хотя это звучит немного задом наперед, не так ли? Предоставление другим объектам уведомления, которое они могут отправить? Хмм.)

Ответы [ 2 ]

0 голосов
/ 05 октября 2011

Хитрость для эффективной прокрутки заключается в использовании CoreGraphics вместо CoreAnimation. Объяснение можно найти здесь:

http://blog.atebits.com/2008/12/fast-scrolling-in-tweetie-with-uitableview/

Вот еще один вопрос StackOverflow: Советы по повышению производительности прокрутки iPhone UITableView?

Так что в этом примере я бы старался избегать маски стрелки и рисовать ее с помощью CG

0 голосов
/ 05 октября 2011

Попробуйте что-то вроде этого:

self.layer.shouldRasterize = YES;

Я не уверен, какой слой (или слои) должен установить это свойство, но я часто сталкиваюсь с проблемой анимации, которая прерывается, какая проблема исправленаустановив shouldRasterize.

...