Я работаю над пользовательским подклассом 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
и указать регион для изменения размера. Проблема в том, что я делаю что-то достаточно разумное, поэтому это не всегда возможно. В этом конкретном примере это будет работать, но более сложная ячейка может не сработать.
Итак, мой вопрос (после всего этого фона): что вы делаете в этой ситуации? У кого-нибудь есть анимирующая кнопка удаления, работающая для пользовательских нарисованных ячеек? Если нет, то какой самый лучший компромисс?