ChatGPT解决这个技术问题 Extra ChatGPT

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

我的 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 的观点。问题不在于如何禁用弹跳,而是如何仅在表格视图需要滚动时启用滚动(和弹跳,最有可能)。
也许使用边界更好,因为我认为如果你稍微旋转一下你的桌子,frame.height 会改变。
应该有: if (table.contentSize.height <= table.frame.size.height)

s
swiftBoy

我想你想设置

tableView.alwaysBounceVertical = NO;

当您使用 AutoLayout 时,这比 contentSize < frame 效果更好。应该被接受的答案。
我正在使用自动布局,这个答案正是我所需要的。
比禁用滚动更好
就像一个魅力,您也可以通过取消勾选反弹和水平/垂直反弹从 interface builder 禁用它。
对于 Swift - tableView.alwaysBounceVertical = false
N
Nati Lara-Diaz

在斯威夫特:

tableView.alwaysBounceVertical = false

我总是赞成这样的 a̶n̶s̶w̶e̶r̶s̶“重写”,因为转换为现代语法需要时间。
R
Roberto Ferraz

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

- (NSArray *)visibleCells

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

tableView.scrollEnabled = NO;

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

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

如果您使用的是 autoLayout,这个解决方案可以完成这项工作:

tableView.alwaysBounceVertical = NO.

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

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

如果您使用的是 AutoLayout,则通过设置仅对您有用:

在代码中:

tableView.alwaysBounceVertical = false

或在界面生成器中:

只需找到此选项和 untick "Bounce Vertically" 选项。

这是参考:

https://i.stack.imgur.com/o3cx6.png

如果您不使用自动布局:

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

c
codercat

尝试这个

[yourTableView setBounces:NO];

@kyle - 感谢您的注意! ——但看那是自动发生的。如果它比屏幕(或其他支架)短,它不会滚动(显然不会反弹,因为它甚至不会滚动)。如果它比屏幕长,它将滚动(并且确实反弹)。不??
也许我一直在使用集合视图太多......也许它就像我描述的集合视图一样工作,但不适用于 UITableView?
A
Akila Wasala

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

https://i.stack.imgur.com/x6Ym0.png


r
rjobidon

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


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

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


c
codercat

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


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

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅