【问题标题】:UICollectionView inside UIView container: didSelectRowAtIndexPath doesn't get called after scrollUIView 容器内的 UICollectionView:滚动后不调用 didSelectRowAtIndexPath
【发布时间】:2015-10-31 00:43:03
【问题描述】:

我在 ViewController 中嵌入了 3 个 UIViews Header/Tabar/Container 一个 ScrollView。所以这是我的结构:

在 ContainerView 中,我加载了一个 UICollectionView(像这样):

let controller = storyboard!.instantiateViewControllerWithIdentifier("myCollectionViewController") as! myCollectionViewController
controller.delegate = self

self.addChildViewController(controller)
controller.view.backgroundColor = UIColor.brownColor()
self.containerView.addSubview(controller.view)
controller.didMoveToParentViewController(self)

一切正常,UICollectionView 的每个单元格都已加载,...唯一的问题是,所有隐藏的单元格(甚至是隐藏的单元格的所有部分)都不可选择。我的意思是我的函数“didSelectRowAtIndexPath”不适用于第一个屏幕外的每个像素。这是我的问题的一个方案:

这是我在滚动之前所拥有的(左侧是一个方案,右侧是我在屏幕上实际拥有的)-> 这里一切正常:

这是我滚动后的样子(左边是方案,右边是我实际在屏幕上的)->只有滚动前显示的像素可以调用“didSelectRowAtIndexPath”:

问题在于 self.view.frame 没有很好地刷新。您知道我应该如何更改此框架以及何时更改吗?

【问题讨论】:

  • 标题和标签栏是如何滚动的。你有那个代码吗?请添加它。
  • @hasan83 我不太明白你的问题。我的代码比较重,哪部分代码可以帮到你?
  • 滚动集合视图不会滚动标题和标签栏。您如何滚动那些允许集合视图获得更多空间的内容?显然,您添加了一些代码来处理该逻辑。添加该代码和触发它的位置。
  • @hasan83 不,滚动集合视图也会滚动标题和 TabBar,因为这 3 个视图嵌入在 UIScrollView 中。我在情节提要中这样做了......所以在我的主视图中,我有一个 ScrollView,我在其中添加了这 3 个视图(Header + TabBar + Container(其中有 collectionViewController))
  • 在移动开发中,您不能将滚动条嵌入到彼此内部,您的结构是错误的。基本上,您的容器框架很小,并且这些像素不可点击,因为它们超出了容器边界。您只能看到它们,因为边界的容器视图掩码设置为 false。在滚动视图中也有 uicollectionview 会失去单元格的可重用性功能,这将导致内存和性能问题。

标签: ios swift scroll uicollectionview didselectrowatindexpath


【解决方案1】:

这似乎是您遇到的另一个问题mentioned in another question 的延续。

查看故事板层次结构,我怀疑问题是,当您更改滚动视图内容大小和集合视图高度时,您没有更改 tab bar view 的高度。集合视图仍然可见,可能是因为您的容器 tab bar view 没有剪辑内容 (clipToBounds=false)。但是由于视图本身并没有延伸到下方那么远,因此视图及其子视图无法识别触摸。

确保您的主视图、滚动视图的内容视图(内容大小)、标签栏视图和集合视图都已正确调整大小。由于您决定不使用标准视图层次结构(补充视图或标题视图),因此您必须自己处理管理视图边界的开销。

【讨论】:

    【解决方案2】:

    问题定义:

    我们面临的所有情况都是我们的UIViewController,除了滚动视图,还显示标题和标签栏。问题是这些额外的视图减少了与我们的滚动条相关的区域(在本例中为UICollectionView)。在小屏幕设备中,我们的滚动条将一次显示少量项目。

    建议的解决方案:

    让那些额外的视图随着滚动条一起滚动 项目。

    如何应用?!

    实现这一目标的最方便的解决方案。出现在滚动视图本身中。例如,UICollectionView 提供了 Supplementary Elements(页眉和页脚),它会随着集合视图项滚动。将您的标题和标签栏移动到UICollectionView 的标题区域。然后,在您的视图控制器中实现viewForSupplementaryElementOfKind

    - (nonnull UICollectionReusableView *)collectionView:(nonnull UICollectionView *)collectionView viewForSupplementaryElementOfKind:(nonnull NSString *)kind atIndexPath:(nonnull NSIndexPath *)indexPath
    {
        UICollectionReusableView *reusableview = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"Header1" forIndexPath:indexPath];
    
        return reusableview;
    }
    

    界面构建器: UICollectionView 的标题区域已经存在。但是,您需要通过界面生成器为其设置 高度,以便在设计时出现。不要忘记为标题设置Collection Reusable View Identifier

    注意:这还需要您做一些额外的工作才能在标题和 TabBar 上设置手势。

    更新:

    考虑删除标题和标签栏容器,并在运行时将其作为子视图重新添加到适当的位置。当 UICollectionView 选项卡被单击时,将其传递给 viewForSupplementaryElementOfKind 方法中的标题可重用视图。当单击标签选项卡时,将其添加到标签容器视图的顶部。当它是一个 tableview 时,将它传递给 headerForRow 方法中的 UITableView 标题。

    【讨论】:

    • 这是一个很好的答案,但我不想有补充元素(我一开始已经尝试过,但它没有按照我想要的方式工作)。我唯一的解决方案是将我的 CollectionViewController 嵌入到我的主 ViewController 内的 UIView(称为容器)中。这样,我可以在容器中嵌入不同类型的对象进行切换,例如 TableViewController、CollectionViewController、UILabels...
    • 啊哈,但是嵌套滚动条肯定是错误的。为什么不考虑将标签栏和标题从视图移动到另一个标签栏按钮单击。换句话说,当集合视图应该出现时,从其父视图中删除标题并将其添加为补充标题。当显示标签时,将其添加为常规视图,当出现表格视图时,将其添加为标题视图。等等。我觉得这是最合适的无故障解决方案。
    • 是的@hasan83,我使用补充元素重新编码了我的观点,它终于奏效了。谢谢你的建议!
    • 你去 ;) 再次感谢您!
    【解决方案3】:

    你必须定义滚动视图的内容大小

    为你的滚动视图创建一个出口

    @IBOutlet weak var scrollview : UIScrollView!
    

    使其高度等于标题、tabBar 和容器的高度之和:

    self.scrollView.contentSize = CGSizeMake(self.view.frame.width, header.frame.height + tabBar.frame.height + container.frame.height)
    

    【讨论】:

    • 我已经这样做了,这是我在加载 collectionView 时拥有的一些打印行: - self.view.frame = (0.0, 64.0, 320.0, 416.0) - self.view.bounds = (0.0 , 0.0, 320.0, 416.0) - self.tabBar.frame = (0.0, 275.0, 320.0, 50.0) - self.tabBar.bounds = (0.0, 0.0, 320.0, 50.0) - self.containerView.frame = (0.0, 325.0 , 320.0, 1763.0) - self.containerView.bounds = (0.0, 0.0, 320.0, 1763.0) - self.scrollView.frame (0.0, -20.0, 320.0, 436.0) - self.scrollView.bounds (0.0, 0.0, 320.0, 436.0) - self.scrollView.contentSize (320.0, 2078.0)
    • 不需要打印边界。 y 坐标和高度在 self.view.frame 中不正确,如果您在 iphone 5/5s 上模拟 te 应用程序,它们应该是 (0.0, 0.0, 320.0, 568)(看看 here)。您还没有打印页眉框架。而且scrollView不应该在-20,它的坐标应该是(0,0,320,568)
    • 那是真的,我会改变它,但这将如何解决我的问题?
    • 你能把创建collectionview单元格的代码贴出来吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多