无法滚动UITableViewCell中的UIScrollView和UITableView本身

时间:2014-06-07 19:20:35

标签: ios uitableview uiscrollview autolayout

我的纯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可以检测到单元格上的点按以切换选择。

问题是我目前可以向上滚动包含这些UITableView的{​​{1}} 我可以滚动{{1}中的UITableViewCells左右,两者。

UIScrollViews时,我无法向上和向下滚动UITableViewCells,但我可以向左和向右滚动UIScrollView。当ScrollViewContainerView.userInteractionEnabled == YES时,我可以向上和向下滚动UITableView,但我无法向左和向右滚动UIScrollView。 ScrollViewContainerView.userInteractionEnabled == NO关于上述层次结构中的其他所有内容。

可以UITableView成为userInteractionEnabled == YES的同级视图(使ScrollViewContainerView成为UIScrollView的直接下降 - - 无法完全摆脱此视图,因为我需要它来获取UIScrollView contentView的尺寸。在这种情况下,与UIScrollView的相反处理成立。

我知道我之前已经在其他项目中做过这件事,但重新开始,我似乎无法弄清楚我错过了什么步骤。目前使用针对iOS 8的Xcode 6 6A215l,虽然我已经在针对iOS 7的Xcode 5下重现了该问题。

3 个答案:

答案 0 :(得分:1)

听起来像scrollview导致你的tableview在滚动时不允许userInteraction。我敢肯定,如果您在UIScrollView委托中调用- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView(对iOS 8不确定),但您可以这样做

 - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {
         if(scrollView.dragging == YES) {
            self.<scrollViewName>.userInteractionEnabled = NO;
         }
 }

这是未经测试的代码,但只需要帮助您到达目的地。

希望它有所帮助!

答案 1 :(得分:1)

我遇到了类似的问题。

我在tableViewCell中有一个scrollView。一切正常。

直到有一天,有人告诉我,当在6p的scrollView上触摸手指时,tableView无法向上/向下滚动。只是6p,而不是5,5s或6。

这让我几乎疯了。

最后,我将scrollView的高度设置为小于storyboard中的高度。

Biu~它有用~~~

但是,我不知道为什么。

答案 2 :(得分:0)

@ user2277872的回答让我走上了正确的轨道,看看我的UIScrollView子类中UIScrollView的{​​{1}}委托方法的输出。在UITableViewCell中添加NSLog()会让我注意到{I} 当我尝试滚动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的{​​{1}}即可。仍然很hacky,仍然需要找到我之前可以剪辑的原因而不是现在。