Helpers - компьютеры, интернет, программирование

Как я могу изменить величину отступа в моем пользовательском UITableViewCell во время редактирования?

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

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

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


  • вы нашли какое-нибудь решение? я страдаю от той же проблемы. Спасибо. 05.06.2013

Ответы:


1

Вы должны переопределить 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;
}
19.04.2011
  • Ах... Я заметил одну проблему. Отступ остается одинаковым независимо от того, нажимает ли пользователь кнопку редактирования или проводит пальцем для удаления. Есть ли способ перехватить пролистывание для удаления и сказать ему сделать что-то другое? 19.04.2011
  • Ах, хорошо, я только что отредактировал свой код и предложил простое решение. Взгляни. 19.04.2011
  • Не обращайте внимания на то, что я тут написал секунду назад - работает отлично. Спасибо! 19.04.2011
  • @Ник извини - я был прав в первый раз. К сожалению, это не совсем работает. Ячейка теперь остается неподвижной при скольжении для удаления, а при нажатии кнопки редактирования она делает отступ на нужное значение. Но когда я нажимаю левую красную кнопку (чтобы справа появилось слово «удалить»), ячейка внезапно снова сдвигается вправо. У вас есть идеи, почему это может быть? 19.04.2011
  • Ну, это все вопрос состояния и битмасок. Я обновил решение. 19.04.2011
  • @Nick, к сожалению, с новым кодом он каждый раз пропускает оператор «если» (я подтвердил, поместив внутрь NSLog). 19.04.2011
  • Хорошо, был ! слишком много в заявлении, моя вина: исправил. Я протестировал его и, что самое смешное, он вел себя так же, но не попал в тело if. Так что это должно сработать, он делает отступы только при входе в режим редактирования, но не при свайпе и не при нажатии на минус. 20.04.2011
  • @Ник, мне очень жаль, что я причиняю боль! Он по-прежнему делает «двойной отступ» — он немного отступает, когда я нажимаю «Редактировать», а затем еще больше, когда я нажимаю круглую красную кнопку. 20.04.2011
  • Яблоко - это боль. Итак, то, что я сделал, уже не кажется мне удобным, но я не знаю другого пути. Проблема заключается в вызове [super layoutViews], который независимо от себя делает отступ. Без него минус не появится, так что пропустить это не вариант. Мне пришлось исправить первоначальный отступ, а затем добавить случай, чтобы сохранить ячейку с отступом для случая: введен режим редактирования и нажат минус. Я надеюсь, что это сработает и для вас. 20.04.2011
  • Это оооочень близко к работе. Единственное, что сейчас, это то, что когда вы проводите пальцем для удаления, а затем отменяете (щелкаете в любом месте экрана), ячейка внезапно пропускается влево, а затем перемещается назад, когда исчезает кнопка удаления. 20.04.2011
  • Извините, в моем рабочем примере этого не происходит. Вы сами по себе сейчас. 20.04.2011

  • 2

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

    Единственное, что сейчас, это то, что когда вы проводите пальцем для удаления, а затем отменяете (щелкните в другом месте экрана), ячейка внезапно пропускается влево, а затем скользит назад, когда кнопка удаления исчезает.

    Я столкнулся с той же проблемой. Я не уверен, почему это происходит, но отключение анимации при настройке фрейма 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];
    
    03.09.2013
    Новые материалы

    Интуитивное понимание тензоров в машинном обучении
    Тензор является важной концепцией во многих научных областях, таких как математика, физика, обработка сигналов и компьютерное зрение, и это лишь некоторые из них. В математике тензор — это..

    Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
    Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

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

    Анимированный математический анализ
    Использование Manim для создания математических анимированных визуализаций Визуализация данных помогает понять скрытые закономерности в данных, которые невозможно визуализировать..

    Создание простого слайдера изображений с помощью JavaScript
    Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

    Создание базы данных с помощью супергероя «Python»
    В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

    ИИ для чайников: руководство для начинающих по пониманию будущего технологий
    Вы чувствуете, что остались позади в мире ИИ? Не волнуйтесь, вы не одиноки! Со всей этой шумихой вокруг искусственного интеллекта может быть трудно понять, с чего начать. Но не позволяйте сленгу..