【问题标题】:How would you implement an UITableView that detects horizontal swipes in order to allow paging?你将如何实现一个检测水平滑动以允许分页的 UITableView?
【发布时间】:2008-12-05 02:41:34
【问题描述】:

我想实现一个 UITableView,它一次显示 20 行。但考虑到我实际上可能要展示 120 个项目,我想使用某种分页来处理这个问题:

使用前 20 个项目填充表。当用户从右向左滑动时,使用接下来的 20 个项目重新加载 UITableView。从左到右滑动将显示前 20 个项目。

我认为继承 UITableView 并处理 UITouches 是可行的,但我不确定如何正确处理触摸以免干扰标准事件处理。

例如。如果用户只是触摸(单击)一行,我希望该行突出显示(选中),然后切换到显示与所选行对应的数据的详细视图。但是,如果用户进行水平滑动,我不希望滑动下方的行被突出显示(因此被选中),相反,我想触发我的 loadprevious 页面/loadnext 页面处理,这将使用相应的重新加载表20 个上一个或下一个项目,具体取决于滑动方向。

有什么建议吗?

【问题讨论】:

    标签: iphone cocoa-touch


    【解决方案1】:

    在表格行上水平滑动已经是导致该行被删除的标准 UI 行为。不要去改变标准的 UI 范例——它会让用户感到困惑,让他们不喜欢你的应用。

    【讨论】:

    • 在“Byline”应用程序中,您可以滑动项目以将其标记为已读或未读,我喜欢这样。
    【解决方案2】:

    使用 UITableView 的部分索引作为替代方案怎么样?

    覆盖以下内容:

    - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView;
    
    - (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index;
    

    这将为您提供表格视图右侧的索引栏,让用户可以快速跳转到表格底部(如果您不知道我的意思,请参阅 iPod 应用程序以获取参考。)您不知道也不必将每个部分都包含在索引中,这样您就可以避免使用 100 个部分使其超载。

    我的索引使用度数符号,因为我的表格部分不是字母。

    如果支持的数据结构仍然是一个大列表,您需要将其分成多个部分。 (您不必为部分显示标题,因此它可以看起来与现有表格相同)

    至于偏离标准 UI 行为...有时在尝试发布应用更新时,您可能会遇到脾气暴躁的审阅者,他们会拒绝您的更新,因为之前版本的应用中存在 ui“问题” .只是一个警告,当你试图解决一个重要的问题时,这是世界上最令人恼火的事情。 向苹果挥拳

    至于性能,我在最多 900 个项目的表上的滚动性能不高。如果它变得矮胖,要注意什么... 1) 确保在对单元进行出队时正确使用重用标识符。 2) 具有复杂控件的自定义表格单元格。 (如果您必须将自己的子视图添加到表格单元格中,UILabels 是最快的,没有透明度) 3) 避免非标准高度的表格单元格(也就是不是 40)。 (一个公认的苹果性能错误,虽然我还没有验证这确实是一个问题。)

    【讨论】:

      【解决方案3】:

      这里要问的主要问题是“为什么”:您认为用户为什么想要访问项目 #527?他如何知道他想要的项目在第 6 页上?在第 17 页?

      您正确指出滚动浏览 1000 个项目很奇怪,但分页浏览 1000 个项目同样奇怪。您可能希望改进应用程序的过滤或排序功能。滚动浏览数千个项目是疯狂的,除非您希望用户阅读/扫描每个项目,在这种情况下,线性列表不是问题。

      UITableView 在右侧有一个节索引,这可能会根据上下文解决您的问题。它确实解决了联系人列表的问题:即使您有 2000 个联系人,您只需在选择起始字母后滚动浏览其中的大约 100 个。 (性能不是问题,因为 UITableView 永远不会创建或请求比屏幕上可见的行更多的行。)

      最后,我使用了一款执行类似分页 + 表格视图的应用,但我讨厌这种体验。感觉完全不是 iPhonish。

      【讨论】:

        【解决方案4】:

        这是一个非常不标准的 UI 范例。您肯定会向上/向下滚动 120 个项目,就像(比如说)联系人应用程序一样。你让自己的生活变得更加复杂 - 你冒着这个应用程序因为奇怪的 UI 而被 Apple 拒绝的严重风险。

        http://forums.macrumors.com/showthread.php?t=532573 中描述了您实现此功能的实际方法

        我已经阅读了那里的代码,它看起来很合理,但我发现您可能还需要处理 touchUpInside,而不是调用 [super touchUpInside] 以避免在水平滑动时选择单元格。

        【讨论】:

          【解决方案5】:

          只需调用触摸取消方法,检查滑动是否发生在触摸点上。然后执行您的功能

          【讨论】:

            【解决方案6】:

            如果我真的想这样做,我会将 UITableView 子类化并将它的多个副本添加到 UIScrollView。解开事件将是可怕的,我认为 UI 不值得付出努力。

            【讨论】:

              【解决方案7】:

              我实际上是在http://forums.macrumors.com/showthread.php?t=532573 上编写了 Airsource Ltd 提到的代码,因此将我指向我自己的代码并没有多大帮助,无论如何,这是我的错,但是嘿,谁不在不同的论坛上使用不同的昵称? ;-)

              无论如何,它在提交到应用商店后就被批准了,恕我直言,它在处理长列表时非常有用。分页是网络上常用的东西,我不想强​​迫用户向下/向上滚动一个有 500+ 行的列表(我是说 500+ 吗?1000+ 行呢?)。

              我同意列表上的水平滑动应该/将使用户能够删除/编辑行作为默认行为。但这不是特定于上下文的吗?

              如果我作为用户是数据的“所有者”,我希望能够删除行。但我是否希望能够删除 AppStore 中的应用程序列表或亚马逊应用程序中的书籍列表中的行?

              列表上的水平滑动只是一种手势,根据上下文,它应该符合用户的期望。

              假设列表有 500 多行,你会怎么做?使用“显示更多”-页脚显示前 25 行? -> 那么你会有 50 行吗?等等?最后,你会有 527 行?除非你去硬核绘制你的单元格,否则表格也会在它上面画出波涛汹涌的。但即使滚动流畅,也无法解决上下滚动 2000 英里像素的问题。

              或者放置一个带有“上一页/下一页”的页眉/页脚 - 按钮,因此一次只显示 25 行?然后,您将强制用户滚动到顶部或底部以切换到上一页或下一页....

              我愿意接受任何建议。在具有“上一个/下一个”内容的东西上向左或向右滑动对我来说似乎是一种自然的手势。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2017-10-21
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多