Пользовательский UITableViewCell и анимация на setSelected: animated:

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

Моя проблема: я вызываю [table deselectRowAtIndexPath:path animated:YES]; всякий раз, когда появляется представление, чтобы соответствовать требованиям Apple HIG. Однако анимации не происходит. Это работало, когда у меня было настраиваемое представление (созданное с помощью подпредставлений), которое было прозрачным (так что фон 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];
    }
}

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


person mips    schedule 20.10.2010    source источник
comment
Итак, как выглядит ваша реализация setSelected:animated: в вашем UITableViewCell подклассе?   -  person Ole Begemann    schedule 21.10.2010
comment
Мой вопрос в основном в том, как это закодировать :)   -  person mips    schedule 21.10.2010
comment
Вам нужно будет переопределить метод, чтобы избежать вызова кода, определенного в суперклассе, и создать свою собственную анимацию. Если вы не знаете, как оживить Google, как это сделать.   -  person vfn    schedule 21.10.2010
comment
Я знаю, как анимировать, мне просто интересно, сработала ли анимация настраиваемого поля с плавающей запятой с помощью beginAnimation или нет, прежде чем я действительно начну кодировать, вы можете это подтвердить?   -  person mips    schedule 21.10.2010
comment
Хорошо, анимация настраиваемого поля не работает. Даже если я переопределю сеттер для анимированного свойства и заставлю его вызывать setNeedsDisplay. Теперь я потерялся.   -  person mips    schedule 21.10.2010


Ответы (1)


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

- (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];
}
person Ronni Egeriis Persson    schedule 11.12.2010
comment
Я использовал UIImageView и настраиваемый градиент выбора. Это вроде подделка, но мне кажется, что она идеальна. Спасибо! - person steipete; 27.02.2011
comment
Вы должны установить selectedBackgroundView ячейки при ее создании, а не в методе setSelected: animated:; это приведет к тому, что он будет без надобности настраиваться снова и снова. - person titaniumdecoy; 15.01.2012