无法滚动 UITableViewCell 中的 UIScrollView 和 UITableView 本身
Posted
技术标签:
【中文标题】无法滚动 UITableViewCell 中的 UIScrollView 和 UITableView 本身【英文标题】:Can't scroll both UIScrollView in UITableViewCell and the UITableView itself 【发布时间】:2014-06-07 19:20:34 【问题描述】:我的纯 AutoLayout UITableViewCell
在 Interface Builder 中看起来像这样:
UITableViewCell
|-> UITableViewCell.contentView
|-> UIView (ScrollViewContainerView)
|-> UIScrollView
|-> left (fixed)
|-> center (fill remaining)
|-> right (fixed)
UIScrollView
包含 left
、center
和 right
UIView
。 left
和 right
都是固定宽度,而 center
扩展以填充 UIView
的其余部分。 UIScrollView
约束将所有边对齐到ScrollViewContainerView
。 ScrollViewContainerView
约束是将所有边与UITableViewCell.contentView
对齐。我将center
的宽度限制为ScrollViewContainerView
宽度的倍数,因此UIScrollView
左右滚动,但高度是固定的并且不滚动。请注意,UIScrollView
已被子类化以包含 this code,以便UITableView
可以检测到单元格上的点击以切换选择。
问题是我目前可以上下滚动包含这些UITableViewCells
的UITableView
或者我可以左右滚动UITableViewCells
中的UIScrollViews
,不是两者。
ScrollViewContainerView.userInteractionEnabled == YES
时,UITableView
不能上下滚动,但UIScrollView可以左右滚动。当ScrollViewContainerView.userInteractionEnabled == NO
时,我可以上下滚动UITableView
,但不能左右滚动UIScrollView。 userInteractionEnabled == YES
用于上述层次结构中的所有其他内容。
我可以将ScrollViewContainerView
作为UIScrollView
的兄弟视图(使UIScrollView
成为contentView
的直接后裔——无法摆脱这一点)。完全查看,因为我需要它来获取UIScrollView
frame
) 的尺寸。在这种情况下,与 userInteractionEnabled
的相反处理成立。
我知道我以前在其他项目中也这样做过,但是重新开始,我似乎无法弄清楚我错过了哪一步。目前使用的是针对 ios 8 的 Xcode 6 6A215l,不过我已经在针对 iOS 7 的 Xcode 5 下重现了这个问题。
【问题讨论】:
你用的是什么iOS?我目前正在一个项目中做类似的事情,它适用于 7。我什至能够垂直滚动滚动视图,当我搞砸了垂直约束并且内容大小变得大于高度框架时。 @Levi 我以前的项目针对 iOS 7 并且有效。我现在正在 iOS 8 上重新实现它。 哇哇哇!为什么在 tableview 单元格中使用滚动视图? 您能否尝试在 iOS 7 设备上运行它并告诉我它的运行情况?因为如果因为操作系统版本而这不起作用,我也会遇到问题 @LordZsolt 您将如何显示需要水平布局并超过单元格宽度的内容? 【参考方案1】:听起来滚动视图导致您的表格视图在滚动时不允许用户交互。我敢肯定,如果您在 UIScrollView 委托中调用 - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
(对于 iOS 8 不确定),但您可以这样做
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
if(scrollView.dragging == YES)
self.<scrollViewName>.userInteractionEnabled = NO;
这是未经测试的代码,但它只是帮助你到达你需要去的地方。
希望对你有帮助!
【讨论】:
【参考方案2】:我遇到了一些类似的问题。
我在 tableViewCell 中有一个滚动视图。一切正常。
直到有一天,有人告诉我,当手指在 6p 中的 scrollView 上触摸时,tableView 无法向上/向下滚动。只是 6p,而不是 5、5s 或 6。
这让我快疯了。
最后,我将滚动视图的高度设置为小于情节提要中的高度。
Biu~它的工作原理~~~
不过,我不知道为什么。
【讨论】:
"最后,我将滚动视图的高度设置为小于故事板中的高度。"这句话救了我的命 :) 它确实有效。我有类似的问题。我看到你的答案和问题解决了。谢谢。【参考方案3】:@user2277872 的回答让我走上了正确的道路,可以查看我的UITableViewCell
子类中UIScrollView
的UIScrollView
委托方法的输出。将NSLog()
放入scrollViewWillBeginDragging:
让我注意到UIScrollView
在我尝试滚动UITableView
时接收滚动事件。我的UIScrollView
的contentSize
在两个 方向上都比其框架大,但我已强制该视图仅水平滚动,因此忽略高度并重置它。那个力量是我的毁灭,我当时应该知道 - 正确的解决方案是固定框架高度。如果UIScrollView
认为没有更多垂直内容,它将正确地将向上/向下滑动手势转发到UITableView
。
虽然我试图弄清楚为什么我的contentSize
在以前没有过大(认为我在某处缺少clipToBounds
),但我正在做的临时强制水平滚动是(在UITableViewCell
的子类):
- (void)drawRect:(CGRect)rect
[super drawRect:rect];
CGSize contentSize = self.scrollView.contentSize;
contentSize.height = self.frame.size.height;
self.scrollView.contentSize = contentSize;
编辑:实际上,这似乎比覆盖drawRect
更好。这将在 UIScrollView
子类中:
/*
* Lock to horizontal scrolling only.
*/
- (void)setContentSize:(CGSize)contentSize
[super setContentSize:CGSizeMake(contentSize.width, 1)];
height
struct
成员并不太重要,只要保证它小于 UITableViewCell
的 frame.size.height
即可。仍然很老套,仍然需要找出为什么我以前可以剪辑而不是现在。
【讨论】:
以上是关于无法滚动 UITableViewCell 中的 UIScrollView 和 UITableView 本身的主要内容,如果未能解决你的问题,请参考以下文章
UITableViewCell 中的 UIScrollview 和维护滚动视图页面
UItableviewcell中的pangesture,表格滚动无法快速工作
Swift 中 UITableViewCell 中的同步滚动 UICollectionViews
UITableViewCell 内的 UIScrollView - 水平滚动