无法滚动 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 包含 leftcenterright UIViewleftright 都是固定宽度,而 center 扩展以填充 UIView 的其余部分。 UIScrollView 约束将所有边对齐到ScrollViewContainerViewScrollViewContainerView 约束是将所有边与UITableViewCell.contentView 对齐。我将center 的宽度限制为ScrollViewContainerView 宽度的倍数,因此UIScrollView 左右滚动,但高度是固定的并且不滚动。请注意,UIScrollView 已被子类化以包含 this code,以便UITableView 可以检测到单元格上的点击以切换选择。

问题是我目前可以上下滚动包含这些UITableViewCellsUITableView或者我可以左右滚动UITableViewCells 中的UIScrollViews不是两者。

ScrollViewContainerView.userInteractionEnabled == YES时,UITableView不能上下滚动,但UIScrollView可以左右滚动。当ScrollViewContainerView.userInteractionEnabled == NO时,我可以上下滚动UITableView,但不能左右滚动UIScrollView。 userInteractionEnabled == YES 用于上述层次结构中的所有其他内容。

可以ScrollViewContainerView 作为UIScrollView 的兄弟视图(使UIScrollView 成为contentView 的直接后裔——无法摆脱这一点)。完全查看,因为我需要它来获取UIScrollViewframe) 的尺寸。在这种情况下,与 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 子类中UIScrollViewUIScrollView 委托方法的输出。将NSLog() 放入scrollViewWillBeginDragging: 让我注意到UIScrollView 在我尝试滚动UITableView 时接收滚动事件。我的UIScrollViewcontentSize两个 方向上都比其框架大,但我已强制该视图仅水平滚动,因此忽略高度并重置它。那个力量是我的毁灭,我当时应该知道 - 正确的解决方案是固定框架高度。如果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 成员并不太重要,只要保证它小于 UITableViewCellframe.size.height 即可。仍然很老套,仍然需要找出为什么我以前可以剪辑而不是现在。

【讨论】:

以上是关于无法滚动 UITableViewCell 中的 UIScrollView 和 UITableView 本身的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewCell 中的 UIScrollview 和维护滚动视图页面

UItableviewcell中的pangesture,表格滚动无法快速工作

Swift 中 UITableViewCell 中的同步滚动 UICollectionViews

UITableViewCell 内的 UIScrollView - 水平滚动

UITableViewCell中的Swift ScrollView不滚动

忽略UITableViewCell内的垂直滚动