首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >UITableView重新排序模式期间的滚动速度(与性能无关)

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

Stack Overflow用户
提问于 2010-07-12 09:29:36
回答 3查看 1.3K关注 0票数 0

有没有一种方法可以提高在UITableView的表格movable row mode中向上/向下拖动单元格的速度?例如,当你在移动单元格时,表格似乎有一个标准的速度允许你拖动它,如果你把它放在设备屏幕的上/下边缘附近,滚动速度似乎会增加。对于给定的单元格高度和一大堆单元格,如果我必须使用它们的标准慢速滚动,这可能需要一段时间来重新排序它们。

所以基本上,当你拖动单元格的时候,我想增加它向上/向下滚动的速度,这样它就不会花那么长的时间来到达你想要放置单元格的地方。

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

从过去的经验中有什么建议或想法吗?任何建议都是非常感谢的!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-07-20 03:10:33

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

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

问题是,当前拖动的单元格是表视图的子视图,所以如果我们移动它,它会随着表视图移动。如果我们要在这个setContentOffset中对此进行校正,它将不起作用,因为单元格的位置将基于与当前contentOffset分开计算的值来设置。因此,我们稍后使用performSelector进行即时更正。

为了方便起见,我把调试行留在了那里。您所需要做的就是使用FastUITableView而不是UITableView (特别是在你的NIB中)

当然,您可能想要添加一些计时设置,以便速度只在1秒左右之后才会加快。这将是微不足道的。

代码语言:javascript
运行
复制
@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
EN

Stack Overflow用户

发布于 2010-07-20 02:22:04

如果列表要变得那么长,您可能需要考虑其他重新排序机制。例如,我的Netflix队列在每次调用中都包含一个指定队列顺序的数字,1表示即将发货的电影,2表示下一部电影,依此类推,187左右表示队列中最近添加的内容。我可以像在iPhone上那样拖动条目进行重新排序,但也可以更改单元格中的序号来对条目进行重新排序,这比必须将#187拖到队列中的第10位要容易得多。在每个条目中也有一个按钮,用于将该条目放在最上面。

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

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

票数 2
EN

Stack Overflow用户

发布于 2017-04-19 23:03:49

根据我的经验,tableView滚动速度取决于拖动的单元格和内容原点/结束点之间的距离。

因此,要提高滚动速度,您不需要子类UITableView。相反,您可以设置tableView的contentInset属性。

例如,在viewDidLoad中调用:

代码语言:javascript
运行
复制
tableView.contentInset = UIEdgeInsetsMake(64, 0, 64, 0)

值64假定tableView上方有statusBar和navBar,tableView和superView之间的顶部/底部约束设置为0,edgesForExtendedLayout设置为.all。该tableView位于navBar和statusBar之下,但由于有了contentInset,它看起来像是附加到了navBar。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3225361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档