【问题标题】:Can't scroll both UIScrollView in UITableViewCell and the UITableView itself无法滚动 UITableViewCell 中的 UIScrollView 和 UITableView 本身
【发布时间】: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 的直接后裔——无法摆脱这一点)。完全查看,因为我需要它来获取UIScrollViewframe) 的尺寸。在这种情况下,与 userInteractionEnabled 的相反处理成立。

我知道我以前在其他项目中也这样做过,但是重新开始,我似乎无法弄清楚我错过了哪一步。目前使用的是针对 iOS 8 的 Xcode 6 6A215l,不过我已经在针对 iOS 7 的 Xcode 5 下重现了这个问题。

【问题讨论】:

  • 你用的是什么iOS?我目前正在一个项目中做类似的事情,它适用于 7。我什至能够垂直滚动滚动视图,当我搞砸了垂直约束并且内容大小变得大于高度框架时。
  • @Levi 我以前的项目针对 iOS 7 并且有效。我现在正在 iOS 8 上重新实现它。
  • 哇哇哇!为什么在 tableview 单元格中使用滚动视图?
  • 您能否尝试在 iOS 7 设备上运行它并告诉我它的运行情况?因为如果因为操作系统版本而这不起作用,我也会遇到问题
  • @LordZsolt 您将如何显示需要水平布局并超过单元格宽度的内容?

标签: ios uitableview uiscrollview autolayout


【解决方案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 即可。仍然很老套,仍然需要找出为什么我以前可以剪辑而不是现在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-10
      • 2013-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-26
      • 1970-01-01
      • 2018-03-30
      相关资源
      最近更新 更多