Вам не хватает пакета pandas_confusion. В командной строке запустите pip install pandas_confusion
.
Благодаря ответу Крейга , который указал мне правильное направление, у меня есть решение для этого , Я возвратил свой коммит , который переместил текстовую позицию на основе режима редактирования и заменил его на новое решение , которое устанавливает весь контентный вид на правильную позицию каждый раз, когда вызывается layoutSubviews, который приводит к автоматической анимации при переключении в режим редактирования и из него:
- (void)layoutSubviews
{
CGRect b = [self bounds];
b.size.height -= 1; // leave room for the separator line
b.size.width += 30; // allow extra width to slide for editing
b.origin.x -= (self.editing) ? 0 : 30; // start 30px left unless editing
[contentView setFrame:b];
[super layoutSubviews];
}
Сделав это таким образом, я смог удалить setFrame: override, найденный в ABTableViewCell.m, потому что его прежняя логика плюс мои дополнения теперь находятся в layoutSubviews.
Я установил светло-серый фон на ячейки, чтобы убедиться, что пользовательский фон работает должным образом, не позволяя нам видеть за ним, как он перемещается назад и вперед, и, кажется, он работает отлично.
Как вы перемещаете текст в настоящее время? Или, точнее, в каком методе UITableViewCell вы выполняете перемещение?
По моему опыту, переопределение метода layoutSubviews
и установка кадра автоматически будут заключены в анимацию.
Например:
- (void)layoutSubviews {
if (self.editing) {
[titleLabel setFrame:CGRectMake(62, 6, 170, 24)];
}
else {
[titleLabel setFrame:CGRectMake(30, 6, 200, 24)];
}
[super layoutSubviews];
}
Также для обработки смахивания: (self.editing &&! self.showingDeleteConfirmation)
У меня тоже возник этот вопрос: как анимировать пользовательский режим редактирования? Решение здесь мне не очень понравилось, поэтому я решил немного подумать и нашел другое решение. Не знаю, лучше ли, но я предпочитаю это. Поэтому я решил поделиться им здесь:
В настраиваемой ячейке (наследуемой от UITableViewCell) просто перегрузите setEditing:
- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
[super setEditing:editing animated:animated];
if (animated) {
[UIView beginAnimations:@"setEditingAnimation" context:nil];
[UIView setAnimationDuration:0.3];
}
if (editing) {
/* do your offset and resize here */
} else {
/* return to the original here*/
}
if (animated)
[UIView commitAnimations];
}
Я не проверяю, совпадает ли значение редактирования, но это просто идея, как я это сделал Это.
Для полного контроля над редактированием в пользовательской ячейке вы должны переопределить метод willTransitionToState в своем подклассе UITableViewCell и проверить маску состояния
- (void)willTransitionToState:(UITableViewCellStateMask)state
{
NSString *logStr = @"Invoked";
if ((state & UITableViewCellStateShowingEditControlMask)
!= 0) {
// you need to move the controls in left
logStr = [NSString stringWithFormat:@"%@
%@",logStr,@"UITableViewCellStateShowingEditControlMask"];
}
if ((state & UITableViewCellStateShowingDeleteConfirmationMask)
!= 0) {
// you need to hide the controls for the delete button
logStr = [NSString stringWithFormat:@"%@
%@",logStr,@"UITableViewCellStateShowingDeleteConfirmationMask"];
}
NSLog(@"%@",logStr);
[super willTransitionToState:state];
}
, также вы можете переопределить layoutSubviews
- (void)layoutSubviews {
// default place for label
CGRect alarmTimeRect = CGRectMake(37, 7, 75, 30);
if (self.editing && !self.showingDeleteConfirmation) {
// move rect in left
alarmTimeRect = CGRectMake(77, 7, 75, 30);
}
[alarmTimeLabel setFrame:alarmTimeRect];
[super layoutSubviews];
}