Скорость прокрутки в режиме переупорядочения UITableView (не связана с производительностью) - PullRequest
0 голосов
/ 12 июля 2010

Есть ли способ увеличить скорость, с помощью которой вы можете перетаскивать ячейку вверх / вниз во время movable row mode таблицы UITableView?Например, кажется, что существует стандартная скорость, при которой таблица позволяет перетаскивать ячейку при ее перемещении, и скорость прокрутки, по-видимому, увеличивается, если вы удерживаете ее около верхнего / нижнего края экрана устройства.Для заданной высоты ячейки и целой связки ячеек может потребоваться некоторое время, чтобы переупорядочить их все, если мне придется использовать их стандартную медленную прокрутку.

Итак, в принципе, я хотел бы увеличить скорость,он перемещается вверх / вниз при перетаскивании ячейки, поэтому вам не понадобится так много времени, чтобы добраться туда, куда вы хотите поместить ячейку.

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

Есть предложения или идеи из прошлого опыта с этим?Любой совет с благодарностью!

Ответы [ 3 ]

2 голосов
/ 19 июля 2010

Вот, пожалуйста. Подтверждение концепции усилителя скорости прокрутки при перемещении ячейки, SDK 3.1. Это может не соответствовать требованиям Apple, поскольку переопределение _beginReorderingForCell и _endReorderingForCell выглядит немного не по назначению. Существуют и другие способы определения того, начинается или заканчивается ячейка переупорядочение (например, создание подкласса UITableViewCell и поиск некоторой меры), но я думаю, что это самый простой способ.

Подход довольно прост: для каждого движения Y пикселей вниз мы сдвигаем 2 * Y пикселей вниз, только при переупорядочении.

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

Я оставил там строки отладки для удобства. Все, что вам нужно сделать, это использовать FastUITableView вместо UITableView (особенно в вашей NIB)

Вы, конечно, можете добавить некоторые временные параметры, чтобы скорость увеличивалась только через 1 секунду или около того. Это будет тривиально.

@interface FastUITableView : UITableView
{
    UITableViewCell *draggingCell;
    CGFloat lastY;
}
@end


@implementation FastUITableView

-(void)_beginReorderingForCell:(UITableViewCell*)cell
{
    printf("begin reordering for cell %x\n",cell);
    draggingCell = cell;
    lastY = -1.0f;
    [super _beginReorderingForCell:cell];
}

-(void)_endReorderingForCell:(UITableViewCell*)cell wasCancelled:(BOOL)cancelled animated:(BOOL)animated
{
    printf("end reordering for cell %x\n",cell);
    draggingCell = nil;
    [super _endReorderingForCell:cell wasCancelled:cancelled animated:animated];
}

-(void)setContentOffset:(CGPoint)pt
{
    if ( !draggingCell )
    {
        [super setContentOffset:pt];
        return;
    }

    if ( lastY < 0 ) lastY = pt.y;
    CGPoint fast = pt;
    float diff = pt.y - lastY;
    //diff *= 0.5; /// <<--- control speed here
    fast.y = pt.y + diff;

    if ( fast.y > self.contentSize.height - self.superview.frame.size.height )
    {
        CGFloat corr = fast.y - self.contentSize.height + self.superview.frame.size.height;
        printf("Correction: %f\n",corr);
        fast.y -= corr;
        diff -= corr;
    } else if ( fast.y < 0.0f ) {
        CGFloat corr = -fast.y;
        printf("Correction: %f\n",corr);
        diff += corr;
        fast.y += corr;
    }

    [self performSelector:@selector(moveCell:) withObject:[NSNumber numberWithFloat:diff] afterDelay:0.01];

    lastY = fast.y;

//  printf("setting content offset: %f -> %f of max %f\n",pt.y, fast.y, self.contentSize.height);
    [super setContentOffset:fast];
}

-(void)moveCell:(NSNumber*)diff
{
    CGRect frame = draggingCell.frame;
    frame.origin.y += [diff floatValue];
//  printf("shifting cell %x with %f\n",draggingCell,[diff floatValue]);
    draggingCell.frame = frame;
}
2 голосов
/ 19 июля 2010

Если список будет таким длинным, вы можете рассмотреть другие механизмы переупорядочения.Например, моя очередь Netflix включает в себя номер в каждом вызове, указывающий порядок очереди, 1 для фильма, который должен быть отправлен, 2 для следующего и так далее до 187 или около того для самых последних добавлений в очередь.Я могу перетащить запись, чтобы изменить порядок, как на iPhone, но я также могу изменить порядковые номера в ячейках, чтобы изменить порядок записей, что намного проще, чем перетаскивать № 187 на 10-е место в очереди.В каждой записи также есть кнопка для размещения этой записи в самом верху.

В вашем приложении вы можете добавить дополнительные элементы управления в режиме редактирования, чтобы помочь в переупорядочении, например, номер заказа или «вверх / вниз 10».кнопки.

Если есть общие причины, по которым ваши пользователи хотели бы заказать записи, у вас может быть кнопка, которая обрабатывает это, например, «перейти к следующей ближайшей синей записи».

0 голосов
/ 19 апреля 2017

По моему опыту, скорость прокрутки tableView зависит от расстояния между перетаскиваемой ячейкой и исходными / конечными точками контента.

Таким образом, чтобы увеличить скорость прокрутки, вам не нужно создавать подкласс UITableView.Вместо этого вы можете установить свойство contentInset для tableView.

Например, вызовите это в viewDidLoad:

tableView.contentInset = UIEdgeInsetsMake(64, 0, 64, 0)

Значение 64 предполагает, что есть статусBar и navBar над tableView, ограничение top / bottom между tableView и superView установлено в 0, а edgeForExtendedLayout равноустановить на все.Этот tableView идет под navBar и statusBar, но из-за contentInset он выглядит так, как будто он подключен к navBar.

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