【问题标题】:How to disable scrolling in UITableView table when the content fits on the screen当内容适合屏幕时如何禁用 UITableView 表中的滚动
【发布时间】:2011-11-16 16:08:37
【问题描述】:

我的 iphone 应用程序中有一些(分组样式)表格(仅在屏幕的一部分上并添加了 Interface Builder,但不是从 UITableViewController 子类化),80% 的时间都很小并且适合屏幕。当表格适合屏幕时,我想禁用滚动,使其更干净一些。但是,如果表格离开屏幕(稍后添加行时),我想再次启用滚动(因为否则您看不到该内容。)

有没有办法做到这一点?我似乎无法弄清楚。我知道该怎么做:

tableView.scrollEnabled = NO;

但我不确定在哪里,或者我是否必须计算表格对象大小或其他东西才能使它工作。


更新: 这是最终对我有用的解决方案:
if (table.contentSize.height < table.frame.size.height) {
   table.scrollEnabled = NO;
 }
else {
   table.scrollEnabled = YES;
 }

我在桌子上调用reloadData 后运行此代码,它计算出正确的大小并且似乎可以工作。

table.frame.size.height 是屏幕上显示的对象的实际大小(您可以在Interface Builder 中看到),而table.contentSize.height 是高度:页眉、页脚和添加的每个单元格的高度在一起。

【问题讨论】:

  • 谢谢。该解决方案对我有用。但是,我最终扩展了 UITableView 并覆盖了 reloadData 以禁用 scrollEnabled。原因是创建我的视图控制器时加载了表视图。这样您就不必调用 reloadData 两次。
  • @JoeBlow 我认为你错过了 OP 的观点。问题不在于如何禁用弹跳,而是如何仅在 tableview 需要滚动时启用滚动(和弹跳,最有可能)。
  • 使用边界可能会更好,因为我认为如果你稍微旋转一下桌子,frame.height 会发生变化。
  • 应该有:if (table.contentSize.height

标签: iphone ios uitableview scroll


【解决方案1】:

所以有多个答案,并且需要一次所有内容,所以我添加了这个答案:

如果您使用的是 AutoLayout,则设置此项仅适用于您:

  • 在代码中:

tableView.alwaysBounceVertical = false

  • 或在界面生成器中:

只要找到这个选项和untickBounce Vertically”选项。

这是参考:

如果您不使用自动布局:

 override func viewDidLayoutSubviews() {
    // Enable scrolling based on content height
    tableView.isScrollEnabled = tableView.contentSize.height > tableView.frame.size.height
 }

【讨论】:

    【解决方案2】:

    // Enable scrolling based on content height self.tableView.scrollEnabled = table.contentSize.height > table.frame.size.height;

    【讨论】:

    • 我想我在阅读了您的解决方案后受到了启发。非常感谢
    • 我在 viewDidAppear 中使用了这个
    • 我的意思是 viewDidLayoutSubviews 不是 viewDidAppear
    【解决方案3】:

    您可以通过在滚动视图区域中选择/取消选择来设置启用/禁用弹跳或滚动表格视图

    【讨论】:

      【解决方案4】:

      在斯威夫特中:

      tableView.alwaysBounceVertical = false
      

      【讨论】:

      • 我总是赞成这样一个̶n̶s̶w̶e̶r̶s̶“重写”,因为转换为现代语法需要时间。
      【解决方案5】:

      您可以在情节提要中进行编辑(如果您正在使用)。在表格视图下有一个复选框,上面写着“启用滚动”。取消选中它就完成了。

      【讨论】:

        【解决方案6】:

        我想你想设置

        tableView.alwaysBounceVertical = NO;
        

        【讨论】:

        • 当您使用 AutoLayout 时,这比 contentSize
        • 我正在使用自动布局,这个答案正是我所需要的。
        • 比禁用滚动要好
        • 就像一个魅力,你也可以从interface builder通过取消反弹和水平/垂直反弹来禁用它。
        • 对于 Swift - tableView.alwaysBounceVertical = false
        【解决方案7】:

        我相信,tableview 单元格的默认高度是 44.0f。您必须将数据源放在数组中吗?然后只需检查[array count]*44.0f 是否超出帧边界,如果是则设置tableview.scrollEnabled = NO,否则将其设置为YES。在您为该特定 tableview 找出数据源的地方执行此操作。

        【讨论】:

        • 我的表格单元格大小不同(并且可能随时更改大小;我正在使用 heightForRowAtIndexPath 方法)所以我可能不想硬编码 44.0f。我相信这个数字和 tableView.rowHeight 一样吗?
        • 您将在该方法中进行总高度计算。简单吧?如果超出屏幕范围,则启用滚动,否则将其禁用。将为所有可见单元格调用该方法。如果您没有足够的数据超出屏幕,您可以使用该方法计算总高度。继续将每次调用时返回的高度添加到全局变量中,然后您就有了总高度。
        • Roberto 的回答是实现这一切并将计算留给 tableview 的一种更简单的方法。
        【解决方案8】:

        您可以使用此函数验证可见单元格的数量:

        - (NSArray *)visibleCells
        

        此方法将返回一个包含可见单元格的数组,因此您可以计算此数组中的对象数并与表中的对象数进行比较。如果相等.. 您可以使用禁用滚动:

        tableView.scrollEnabled = NO;
        

        正如@Ginny 提到的......我们可能会遇到部分可见单元格的问题,所以这个解决方案在这种情况下效果更好:

        tableView.scrollEnabled = (tableView.contentSize.height <= CGRectGetHeight(tableView.frame));
        

        如果您使用自动布局,这个解决方案可以完成这项工作:

        tableView.alwaysBounceVertical = NO.
        

        【讨论】:

        • 谢谢!这现在主要为我工作。我现在唯一遇到的问题是,当单元格部分可见时,它们仍然算作可见,因此在这种情况下我希望启用它时滚动会被禁用。
        • 想通了!事实证明,由于部分可见的单元格问题,您根本无法真正使用 visibleCells,但这有效:if (table.contentSize.height &lt; table.frame.size.height) >> 请参阅原始帖子中的编辑。
        【解决方案9】:

        试试这个

        [yourTableView setBounces:NO];
        

        【讨论】:

        • @kyle -- 感谢您的留言! ——但看那是自动发生的。如果它比屏幕(或其他支架)短,它不会滚动(显然不会反弹,因为它甚至不会滚动)。如果它比屏幕长,它将滚动(并且确实反弹)。没有??
        • 也许我使用的集合视图太多了......也许它就像我描述的那样适用于集合视图,但不适用于 UITableView??
        猜你喜欢
        • 2011-07-26
        • 1970-01-01
        • 2020-02-22
        • 1970-01-01
        • 1970-01-01
        • 2022-07-01
        • 1970-01-01
        • 2011-10-08
        • 2012-09-02
        相关资源
        最近更新 更多