Я работаю над настраиваемым подклассом UITableViewCell, где все отрисовывается в коде вместо использования UILabels и т. д. (Это отчасти обучающее упражнение, отчасти потому, что рисование кода происходит намного быстрее. Я знаю, что для пары ярлыков это не будет иметь большого значения, но со временем я захочу обобщить это на более сложные ячейки.)
В настоящее время я борюсь с анимацией кнопки удаления: как анимировать сжатие ячейки, когда кнопка удаления скользит внутрь.
Во-первых, я рисую в настраиваемом подвиде contentView ячейки. Все отрисовывается в этом одном подпредставлении.
Я устанавливаю размер подпредставления, перехватывая layoutSubviews в самой ячейке, и делаю:
- (void)layoutSubviews
{
[super layoutSubviews];
CGRect b = [self.contentView bounds];
[subcontentView setFrame:b];
}
Я делаю это, а не просто устанавливаю маску с автоизменением размеров, потому что это казалось более надежным при тестировании , но я могу использовать подход с автоматическим изменением размеров маски при тестировании, если это необходимо.
Теперь, когда кто-то попадает в минус, по умолчанию происходит сжатие представления.
Я могу избежать этого, когда настраиваю свою ячейку, вызывая
subcontentView.contentMode = UIViewContentModeRedraw;
. Это дает мне правильный конечный результат (мое пользовательское представление перерисовывается с новым размером, и размещается правильно, как и первое изображение, которое я опубликовал), но анимация перехода неприятна: похоже, что ячейка растягивается и сжимается до размеров.
Я знаю, почему анимация работает именно так: Core Animation не просит ваше представление перерисовывать для каждого кадра, оно заставляет его перерисовывать для конечной позиции анимации, а затем интерполирует, чтобы найти средние биты.
Другое решение - сделать
subcontentView.contentMode = UIViewContentModeLeft;
Это просто рисует кнопку удаления над моей ячейкой, поэтому она покрывает ее часть.
Если я также использую
- (void) didTransitionToState:(UITableViewCellStateMask)state
{
[self setNeedsDisplay];
}
, то после того, как кнопка удаления сдвинется в ячейку, она «перескочит» на правильный размер. Таким образом, не будет хорошей слайд-анимации, но, по крайней мере, в конце я получу правильный результат.
Думаю, я мог бы запустить свою собственную анимацию параллельно с появлением кнопки удаления, временное создание другого представления с копией изображения моего представления в старом размере, установка моего на новый размер и переход между ними - так было бы красивое перекрестное затухание вместо резкого скачка. Кто-нибудь использует такую технику?
Теперь вы можете спросить, почему я не могу использовать свойство contentStretch
и задать ему область для изменения размера. Проблема в том, что я делаю что-то достаточно универсальное, поэтому это не всегда возможно. В этом конкретном примере это сработает, но более сложная ячейка - нет.
Итак, мой вопрос (после всего этого) таков: что вы делаете в этой ситуации? У кого-нибудь есть анимированная кнопка удаления, работающая для пользовательских нарисованных ячеек? Если нет, то что? лучший компромисс?