Как я могу изменить размер отступа на моем пользовательском UITableViewCell при редактировании? - PullRequest
6 голосов
/ 19 апреля 2011

Я создал пользовательский UITableViewCell и сделал это правильно (добавив все к contentView и переопределив layoutSubviews, чтобы мои подпредставления относились к contentView.bounds).

Когда пользователь нажимает кнопку EditКнопка, отступ таблицы, чтобы освободить место для красного знака удаления.Это нормально, но по умолчанию количество отступов слишком велико и портит внешний вид моей пользовательской ячейки.Как я могу уменьшить количество отступов?setIndentationLevel и tableView:IndentationLevelForRowAtIndexPath, похоже, ничего не делают.

(Кто-то задавал подобный вопрос здесь , но он так и не был решен).

Ответы [ 2 ]

15 голосов
/ 19 апреля 2011

Вы должны переопределить layoutSubviews и сделать что-то вроде следующего.И не забывайте устанавливать уровень отступа больше 0 :) Для пользовательских ячеек уровень отступа не применяется по умолчанию.

Чтобы избежать отступа для одного движения пальца для удаления жеста, вам придется проделать еще большую работу.Существует состояние, которое отражает состояние редактирования ячейки. Оно не является общедоступным, но к нему можно получить доступ с помощью - (void)willTransitionToState:(UITableViewCellStateMask)aState, поэтому сохранение его в свойстве делает работу для layoutViews.

Документация Apple для willTransitionToState:

Обратите внимание, что когда пользователь проводит пальцем по ячейке, чтобы удалить ее, ячейка переходит в состояние, определенное постоянной UITableViewCellStateShowingDeleteConfirmationMask, ноUITableViewCellStateShowingEditControlMask не установлен.

заголовочный файл

int state;

...

@property (nonatomic) int state;

...

реализация ячейки

@synthesize state;

...

- (void)layoutSubviews
{
    [super layoutSubviews];

    self.contentView.frame = CGRectMake(0,                                          
                                        self.contentView.frame.origin.y,
                                        self.contentView.frame.size.width, 
                                        self.contentView.frame.size.height);

    if (self.editing
        && ((state & UITableViewCellStateShowingEditControlMask)
        && !(state & UITableViewCellStateShowingDeleteConfirmationMask)) || 
            ((state & UITableViewCellStateShowingEditControlMask)
         && (state & UITableViewCellStateShowingDeleteConfirmationMask))) 
    {
        float indentPoints = self.indentationLevel * self.indentationWidth;

        self.contentView.frame = CGRectMake(indentPoints,
                                            self.contentView.frame.origin.y,
                                            self.contentView.frame.size.width - indentPoints, 
                                            self.contentView.frame.size.height);    
    }
}

- (void)willTransitionToState:(UITableViewCellStateMask)aState
{
    [super willTransitionToState:aState];
    self.state = aState;
}
1 голос
/ 03 сентября 2013

Обновленный ответ Ника Уивера отлично работает, за исключением проблемы, на которую указал Рек Леви:

Теперь единственное, что вы проводите, чтобы удалить, а затем отменить (нажмите в любом месте экрана) ячейка внезапно переходит влево и затем скользит назад, когда кнопка удаления исчезает

Я столкнулся с той же проблемой.Я не уверен, почему это происходит, но отключение анимации при установке фрейма contentView разрешает ее.

...
[UIView setAnimationsEnabled:NO];
self.contentView.frame = CGRectMake(indentPoints,
                                        self.contentView.frame.origin.y,
                                        self.contentView.frame.size.width - indentPoints, 
                                        self.contentView.frame.size.height);
[UIView setAnimationsEnabled:YES];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...