当内容适合屏幕时如何禁用UITableView表中的滚动


240

我的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.heightInterface Builder屏幕上显示的对象的实际大小(可以在中看到),而是以下table.contentSize.height对象的高度:页眉,页脚和每个单元格加在一起的高度。


1
谢谢。该解决方案对我有用。但是,我最终扩展了UITableView并覆盖了reloadData以禁用scrollEnabled。原因是在创建视图控制器时加载了表视图。这样,您不必两次调用reloadData。
布兰登·奥罗克

@JoeBlow我想你错过了OP的观点。问题不是如何禁用弹跳,而是如何仅在需要滚动表视图时启用滚动(最有可能发生弹跳)。
凯尔·克莱格

使用边界也许更好,因为我认为如果您稍微旋转一下表格,frame.height将会改变。
里卡多2015年

应该是:if(table.contentSize.height <= table.frame.size.height)
Grzegorz Krukowski16年

Answers:


395

我想你要设定

tableView.alwaysBounceVertical = NO;

6
使用AutoLayout时,此方法比contentSize <frame更好。应该接受答案。
约书亚舞

1
我正在使用自动布局,而这个答案正是我所需要的。
Golden Thumb

3
总比禁用滚动更好
Kirit Vaghela 2015年

5
就像吊饰一样工作,您也可以interface builder通过取消弹跳和水平/垂直弹跳来禁用它。
Ahsan Ebrahim 2015年

11
对于Swift- tableView.alwaysBounceVertical = false
swiftBoy '16

44

您可以使用此功能验证可见单元的数量:

- (NSArray *)visibleCells

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

tableView.scrollEnabled = NO;

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

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

如果您使用的是autoLayout,请执行以下解决方案:

tableView.alwaysBounceVertical = NO.

谢谢!现在,这主要为我工作。我现在遇到的唯一问题是,当单元格部分可见时,它们仍然算为可见,因此在这种情况下,如果希望启用它,则滚动被禁用。
金妮

6
弄清楚了!事实证明,由于部分可见的单元格问题,您根本无法真正使用visibleCells,但这可以起作用:if (table.contentSize.height < table.frame.size.height)>>参见原始文章中的edit。
金妮


14

因此,存在多个答案,并且一次需要所有内容,因此我添加了以下答案:

如果您使用的是自动版式,则仅通过设置即可适用于您:

  • 在代码中:

tableView.alwaysBounceVertical = false

  • 或在Interface Builder中:

只需找到此选项和untickBounce Vertically”选项即可。

这是参考:

在此处输入图片说明

如果您不使用自动版式:

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

13

试试这个

[yourTableView setBounces:NO];

@kyle-感谢您的来信!-但是看起来就是自动发生的。如果它比屏幕(或其他支架)短,它将不会滚动(显然不会反弹,因为它甚至不会滚动)。如果它比屏幕长,它将滚动(甚至反弹)。没有??
Fattie

也许我使用了过多的集合视图...也许它可以像我描述的那样用于集合视图,但不适用于UITableView?
Fattie


3

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


3

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


3
阅读您的解决方案后,我认为我很高兴。非常感谢
Arash

我在viewDidAppear中使用了它
Maria

1
我的意思是viewDidLayoutSubviews不是viewDidAppear
Maria

0

我相信一个表格单元的默认高度是44.0f。您必须将数据源放在数组中吗?然后只需检查是否[array count]*44.0f超出了框架范围,如果已设置tableview.scrollEnabled = NO,则将其设置为“是”。在为该特定表视图找出数据源的位置执行此操作。


我的表格单元格大小不同(可能随时更改大小;我正在使用heightForRowAtIndexPath方法),所以我可能不想对44.0f进行硬编码。我相信该数字与tableView.rowHeight相同吗?
金妮

然后,您将使用该方法进行总高度计算。简单吧?如果超出屏幕范围,请启用滚动,否则将其禁用。将为所有可见单元格调用该方法。如果没有足够的数据超过屏幕,则可以使用该方法直接计算总高度。将每次调用返回的高度添加到全局变量中,您便拥有了总高度。
Bourne

Roberto的答案是实现所有这些并将计算留给表格视图的更简单方法。
伯恩(Bourne)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.