Iphone UITableView重新排序模式期间的滚动速度(与性能无关)

Iphone UITableView重新排序模式期间的滚动速度(与性能无关),iphone,uitableview,scroll,performance,Iphone,Uitableview,Scroll,Performance,在UITableView的表的移动行模式期间,是否有方法提高上/下拖动单元格的速度?例如,似乎有一个标准速度,当您移动单元格时,表格允许您拖动单元格,如果您将其保持在设备屏幕的上/下边缘附近,滚动速度似乎会增加。对于给定的单元格高度和一大堆单元格,如果我必须使用它们的标准慢速滚动,则可能需要一段时间来重新排列它们 所以基本上,我想提高它的速度,当你拖动单元格时,它会上下滚动,这样就不会花那么长的时间到达你想把单元格放到的地方 我知道你可以通过降低单元格高度来加快移动过程,在设备屏幕上放置更多的单

UITableView
的表的
移动行模式
期间,是否有方法提高上/下拖动单元格的速度?例如,似乎有一个标准速度,当您移动单元格时,表格允许您拖动单元格,如果您将其保持在设备屏幕的上/下边缘附近,滚动速度似乎会增加。对于给定的单元格高度和一大堆单元格,如果我必须使用它们的标准慢速滚动,则可能需要一段时间来重新排列它们

所以基本上,我想提高它的速度,当你拖动单元格时,它会上下滚动,这样就不会花那么长的时间到达你想把单元格放到的地方

我知道你可以通过降低单元格高度来加快移动过程,在设备屏幕上放置更多的单元格,但我宁愿这样做,除非我不能提高滚动速度


从过去的经验中有什么建议或想法吗?非常感谢您的建议 在您的应用程序中,您可以在“编辑”视图中添加额外的控件,以帮助重新排序,例如订单号或“向上/向下10”按钮


<> P>如果你的用户想要订购条目有共同的原因,你可以有一个按钮来处理它,比如“移动到下一个最近的蓝色条目”。

< P>如果列表要长的话,你可能想考虑其他的重新排序机制。例如,我的Netflix队列在每次调用中都包含一个数字,指定队列的顺序,1表示即将发布的电影,2表示下一部电影,依此类推到187左右,表示最近添加到队列中的内容。我可以像在iPhone上一样拖动条目来重新排序,但我也可以更改单元格中的订单号来重新排序条目,这比将187号拖动到队列中的第十位要容易得多。每个条目中都有一个按钮,用于将该条目置于最上方

在您的应用程序中,您可以在“编辑”视图中添加额外的控件,以帮助重新排序,例如订单号或“向上/向下10”按钮


如果您的用户想要订购条目有一些常见的原因,您可以使用一个按钮来处理,例如“上移到下一个最近的蓝色条目。”

给您。SDK 3.1是移动单元格时滚动速度增强器的概念证明。它可能无法通过苹果的要求,因为覆盖_beginReorderingForCell和_endReorderingForCell看起来有点不合规格。有其他方法可以确定单元格是否开始或结束重新排序(例如,对UITableViewCell进行子类化并找到一些度量),但我认为这是最简单的方法

方法非常简单:对于Y像素的每一次向下移动,我们只在重新排序时向下移动2*Y像素

问题是,当前拖动的单元格是表视图的子视图,因此如果移动它,它将随表视图一起移动。如果我们要在此
setContentOffset
中对此进行更正,则它没有任何效果,因为单元格的位置将根据当前
contentOffset
之外计算的值进行设置。因此,我们稍后将使用
性能选择器
纠正一个瞬间

为了方便起见,我把调试行留在那里了。您只需使用
fastutableview
而不是
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;
}
@接口FastUITableView:UITableView
{
UITableViewCell*拖动单元格;
成形术;
}
@结束
@实现FastUITableView
-(无效)_beginReorderingForCell:(UITableViewCell*)单元格
{
printf(“开始重新排序单元格%x\n”,单元格);
拖动单元=单元;
lastY=-1.0f;
[super_beginReorderingForCell:cell];
}
-(void)_endReorderingForCell:(UITableViewCell*)单元格已取消:(BOOL)取消动画:(BOOL)动画
{
printf(“结束单元格%x\n的重新排序”,单元格);
draggingCell=零;
[super_endReorderingForCell:单元格被取消:取消动画:动画];
}
-(无效)setContentOffset:(CGPoint)pt
{
if(!draggingCell)
{
[超级设置内容偏移量:pt];
返回;
}
如果(lastY<0)lastY=pt.y;
CGPoint fast=pt;
浮动差异=第y部分-整形;

//diff*=0.5;//给你。这是移动单元格时滚动速度增强的概念证明,SDK 3.1。它可能无法满足苹果的要求,因为覆盖“beginReorderingForCell”和“endReorderingForCell”看起来有点不合规格。有其他方法可以确定单元格是否开始或结束重新排序(例如,子类化
UITableViewCell
并找到一些度量值),但我认为这是最简单的方法

方法非常简单:对于Y像素的每一次向下移动,我们只在重新排序时向下移动2*Y像素

问题是,当前拖动的单元格是表视图的子视图,因此如果移动它,它将随表视图一起移动。如果我们要在此
setContentOffset
中对此进行更正,则它没有任何效果,因为单元格的位置将根据与当前
contentOffset
不同的计算值进行设置e我们稍后使用
performSelector
纠正一个瞬间

为了方便起见,我把调试行放在那里了。你所需要做的就是使用
FastUI
tableView.contentInset = UIEdgeInsetsMake(64, 0, 64, 0)