Анимация пользовательски привлеченного UITableViewCell при вводе режима редактирования

Вам не хватает пакета pandas_confusion. В командной строке запустите pip install pandas_confusion.

49
задан Josh 23 May 2011 в 03:42
поделиться

5 ответов

Благодаря ответу Крейга , который указал мне правильное направление, у меня есть решение для этого , Я возвратил свой коммит , который переместил текстовую позицию на основе режима редактирования и заменил его на новое решение , которое устанавливает весь контентный вид на правильную позицию каждый раз, когда вызывается 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.

Я установил светло-серый фон на ячейки, чтобы убедиться, что пользовательский фон работает должным образом, не позволяя нам видеть за ним, как он перемещается назад и вперед, и, кажется, он работает отлично.

24
ответ дан Community 7 November 2019 в 11:54
поделиться

Как вы перемещаете текст в настоящее время? Или, точнее, в каком методе UITableViewCell вы выполняете перемещение?

По моему опыту, переопределение метода layoutSubviews и установка кадра автоматически будут заключены в анимацию.

Например:

- (void)layoutSubviews {
    if (self.editing) {
        [titleLabel setFrame:CGRectMake(62, 6, 170, 24)];
    }
    else {
        [titleLabel setFrame:CGRectMake(30, 6, 200, 24)];
    }
    [super layoutSubviews];
}
10
ответ дан Craig Otis 7 November 2019 в 11:54
поделиться

Также для обработки смахивания: (self.editing &&! self.showingDeleteConfirmation)

8
ответ дан 7 November 2019 в 11:54
поделиться

У меня тоже возник этот вопрос: как анимировать пользовательский режим редактирования? Решение здесь мне не очень понравилось, поэтому я решил немного подумать и нашел другое решение. Не знаю, лучше ли, но я предпочитаю это. Поэтому я решил поделиться им здесь:

В настраиваемой ячейке (наследуемой от 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];
}

Я не проверяю, совпадает ли значение редактирования, но это просто идея, как я это сделал Это.

3
ответ дан 7 November 2019 в 11:54
поделиться

Для полного контроля над редактированием в пользовательской ячейке вы должны переопределить метод 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];
}
9
ответ дан 7 November 2019 в 11:54
поделиться