Пользовательский UITableViewCell и анимация на setSelected: animated: - PullRequest
3 голосов
/ 21 октября 2010

У меня есть подкласс UITableViewCell, который рисует в методе drawRect :. Целый прямоугольник нарисован на заказ, включая фон. Мне удалось получить очень сложные клетки, при этом прокрутка была очень плавной.

Моя проблема: я звоню [table deselectRowAtIndexPath:path animated:YES]; всякий раз, когда появляется вид, чтобы соответствовать HIG от Apple. Однако никакой анимации не происходит. Это работало, когда у меня был собственный вид (созданный с подпредставлениями), который был прозрачным (поэтому фон Apple будет отображаться ниже), конечно. Теперь это не так.

Мой drawRect: вызывается один раз в течение "времени анимации", примерно на полпути. Я думаю, что это происходит, потому что он анимирует выделенное свойство ячейки от 1 до 0 и привязывается к 0, когда падает ниже 0,5.

Как я могу оживить этот переход? Мое предположение было бы использовать обычные beginAnimations: и т. Д. И анимировать настраиваемое поле с плавающей запятой в моем объекте ячейки от 1 до 0. Будет ли это вызывать drawRect: повторно для анимации?

Обновление Мне удалось заставить это почти работать. Я переопределил setSelected: animated: вот так:

- (void) setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:NO];

    if (animated) {
        [CATransaction begin];
        CATransition* animation = [CATransition animation];
        animation.type = kCATransitionFade;
        animation.duration = 0.6;
        [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
        [view.layer addAnimation:animation forKey:@"deselectRow"];
        [CATransaction commit];
    }
}

Это прекрасно работает, если представление таблицы на экране. Но если я возвращаюсь к табличному представлению из навигации (назад), вместо того, чтобы переходить от выбранного к не выбранному, он превращается из невидимого в не выбранное. Что может вызвать это?

1 Ответ

7 голосов
/ 12 декабря 2010

Немного поздний ответ, но он все еще может быть полезен вам и другим. Что вам нужно сделать, это назначить свой пользовательский выбранный вид перед отправкой сообщений super, например:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    UIView *view = [[UIView alloc] initWithFrame:self.frame];
    view.backgroundColor = [UIColor colorWithRed:.9 green:.0 blue:.125 alpha:1.0];

    self.selectedBackgroundView = view;

    [super setSelected:selected animated:animated];
}
...