Подкласс UITableViewCell, нарисованный в коде, анимация кнопки «Удалить» в

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

В настоящее время я борюсь с анимацией кнопки удаления: как анимировать сжатие ячейки, когда кнопка удаления скользит внутрь.

image

Во-первых, я рисую в настраиваемом подвиде contentView ячейки. Все отрисовывается в этом одном подпредставлении.

Я устанавливаю размер подпредставления, перехватывая layoutSubviews в самой ячейке, и делаю:

- (void)layoutSubviews
{
    [super layoutSubviews];
    CGRect b = [self.contentView bounds];
    [subcontentView setFrame:b];    
}

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

Теперь, когда кто-то попадает в минус, по умолчанию происходит сжатие представления.

enter image description here

Я могу избежать этого, когда настраиваю свою ячейку, вызывая

subcontentView.contentMode = UIViewContentModeRedraw;

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

Я знаю, почему анимация работает именно так: Core Animation не просит ваше представление перерисовывать для каждого кадра, оно заставляет его перерисовывать для конечной позиции анимации, а затем интерполирует, чтобы найти средние биты.

Другое решение - сделать

subcontentView.contentMode = UIViewContentModeLeft;

Это просто рисует кнопку удаления над моей ячейкой, поэтому она покрывает ее часть.

enter image description here

Если я также использую

- (void) didTransitionToState:(UITableViewCellStateMask)state
{
    [self setNeedsDisplay];
}

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

Думаю, я мог бы запустить свою собственную анимацию параллельно с появлением кнопки удаления, временное создание другого представления с копией изображения моего представления в старом размере, установка моего на новый размер и переход между ними - так было бы красивое перекрестное затухание вместо резкого скачка. Кто-нибудь использует такую ​​технику?

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

Итак, мой вопрос (после всего этого) таков: что вы делаете в этой ситуации? У кого-нибудь есть анимированная кнопка удаления, работающая для пользовательских нарисованных ячеек? Если нет, то что? лучший компромисс?

6
задан Amy Worrall 21 April 2011 в 10:27
поделиться