Вот, пожалуйста. Подтверждение концепции усилителя скорости прокрутки при перемещении ячейки, 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;
}