Подтвердить что ты не робот

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

Фон

Прежде всего, большое спасибо atebits за их очень информативное сообщение в блоге Быстрая прокрутка в Tweetie с помощью UITableView. В сообщении подробно объясняется, как разработчики смогли максимально сжать производительность прокрутки из UITableViews в Tweetie.

Цели

Начиная с исходного кода, связанного с сообщением в блоге (оригинал) (my github repo):

  • Разрешить UITableView с помощью этих настраиваемых ячеек переключиться в режим редактирования, подвергая пользовательский интерфейс удалению элемента из таблицы. (github commit)

  • Переместите текст ячейки в сторону, когда элемент управления удаления сместится слева. Это полно, хотя текст перескакивает назад и вперед без анимации. (github commit)

  • Примените анимацию к движению текста в цели 2 выше для приятного восприятия пользователем. Это шаг, на котором я застрял.

Вопрос

Каков наилучший способ представить эту анимацию для завершения цели 3? Было бы неплохо, если бы это можно было сделать таким образом, чтобы сохранить логику из моего last commit, потому что мне бы понравился вариант перемещения конфликтной части только в том случае, если любые не конфликтующие части (например, текст с выравниванием по правому краю) остаются в одном месте или перемещают другое количество пикселей. Если выше это невозможно, отмените мой последний фиксатор и замените его опцией, которая сместит весь вид вправо, также будет работоспособным решением.

Я ценю любую помощь, которую любой может предоставить, от быстрых указателей и идей вплоть до компиляции кода или github. Конечно, вы можете, если хотите, раскошелиться

4b9b3361

Ответ 1

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

- (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.

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

Еще раз спасибо Крейгу и всем, кто заглянул в это.

GitHub совершает для этого решения: (ссылка)

Ответ 2

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

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

Например:

- (void)layoutSubviews {
    if (self.editing) {
        [titleLabel setFrame:CGRectMake(62, 6, 170, 24)];
    }
    else {
        [titleLabel setFrame:CGRectMake(30, 6, 200, 24)];
    }
    [super layoutSubviews];
}

Ответ 3

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

Ответ 4

Для обработки прокрутки: (self.editing &! self.showingDeleteConfirmation)

Ответ 5

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

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

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

Ответ 6

На самом деле существует четыре состояния edite.

UITableViewCellStateDefaultMask = 0

UITableViewCellStateShowingEditControlMask = 1 < < 0 = 0b01 = 1, установив tableView.edit = YES

UITableViewCellStateShowingDeleteConfirmationMask = 1 < 1 = 0b10 = 2 путем прокрутки для удаления

UITableViewCellStateShowingEditControlMask и UITableViewCellStateShowingDeleteConfirmationMask = (1 < 1) & (1 < 0) = 0b11 = 3, установив tableView.edit = YES и нажмите кнопку "Стоп"

Что меня смутило, так это то, что когда состояние 3 переходит в состояние 1, никакой селектор не будет вызван, который не будет использовать self.showingDeleteConfirmation для изменения макета в iOS7. Поэтому для того, чтобы state 2 и state 3, я добавил переменную экземпляра для ее реализации. Это отлично работает для меня.

-(void)willTransitionToState:(UITableViewCellStateMask)state{
    [super willTransitionToState:state];

    //Custom delete button from
    //http://stackoverflow.com/info/19159476/uitableviewcelldeleteconfirmationcontrol-issue
    if((state & UITableViewCellStateShowingDeleteConfirmationMask) == UITableViewCellStateShowingDeleteConfirmationMask){
        [self recurseAndReplaceSubViewIfDeleteConfirmationControl:self.subviews];
        [self performSelector:@selector(recurseAndReplaceSubViewIfDeleteConfirmationControl:) withObject:self.subviews afterDelay:0];
    }

    _swipeDelete = NO;

    if(state==2){
        //Swipe to delete confirm
        _swipeDelete = YES;
    }

    if(state==3){
        //Edit state to delete confirm
    }
}

- (void)layoutSubviews{

    [super layoutSubviews];

    self.contentView.frame = CGRectMake(10, 5.0, 300, self.frame.size.height - 10);

    if(self.editing){
        self.contentView.frame = CGRectMake(40, 5.0, 270, self.frame.size.height - 10);
    }

    if(_swipeDelete){
        self.contentView.frame = CGRectMake(10, 5.0, 300, self.frame.size.height - 10);
    }
}