滚动 UICollectionView 会导致父 UIView 中的 UITableView 将 Collection View 推出 Frame

Posted

技术标签:

【中文标题】滚动 UICollectionView 会导致父 UIView 中的 UITableView 将 Collection View 推出 Frame【英文标题】:Scrolling UICollectionView causes UITableView in parent UIView to push Collection View out of Frame 【发布时间】:2014-10-30 21:54:13 【问题描述】:

我的应用有一个隐藏在UINavigationBar 后面的小UIView。我设置了一个手势识别器,当点击导航栏时,这个“弹出框”UIView 会下降到视图中,下面的UITableView 会下降以腾出空间。这很好用,但是当我尝试在集合视图中滑动以加载新单元格时,表格视图会将降低的视图推回导航栏后面。

我试图在弹出视图和表格视图上放置 lldb 观察点,看看我是否可以跟踪视图框架的变化,但我似乎永远无法达到观察点:

(lldb) w s v self->_drawerView->_layer
Watchpoint created: Watchpoint 3: addr = 0x7feac410b788 size = 8 state = enabled type = w
    watchpoint spec = 'self->_drawerView->_layer'
    new value: 0x00007feac410b850

(lldb) w s v self->_tableView->_layer
Watchpoint created: Watchpoint 2: addr = 0x7feac6008008 size = 8 state = enabled type = w
    watchpoint spec = 'self->_tableView->_layer'
    new value: 0x00007feac4102cf0

这是我的动画代码。我已经设置了断点并且知道这段代码不会导致这个错误。

- (void)toggleDrawer:(UIGestureRecognizer *)recognizer 

    [UIView animateWithDuration:0.5 delay:0.0 usingSpringWithDamping:0.6f initialSpringVelocity:0.5f options:0 animations:^
        if (lowerDrawer) 
            self.drawerView.frame = CGRectMake(self.drawerView.frame.origin.x, self.drawerView.frame.origin.y + 70, self.drawerView.frame.size.width, self.drawerView.frame.size.height);

            // lower table at same time
            self.tableView.frame = CGRectMake(self.tableView.frame.origin.x, self.tableView.frame.origin.y + 70, self.tableView.frame.size.width, self.tableView.frame.size.height - 70);

            // flip arrow
            self.arrowImageView.transform = CGAffineTransformMakeRotation(M_PI);

            lowerDrawer = NO;

         else 
            self.drawerView.frame = CGRectMake(self.drawerView.frame.origin.x, self.drawerView.frame.origin.y - 70, self.drawerView.frame.size.width, self.drawerView.frame.size.height);

            self.tableView.frame = CGRectMake(self.tableView.frame.origin.x, self.tableView.frame.origin.y - 70, self.tableView.frame.size.width, self.tableView.frame.size.height + 70);

            // flip arrow
            self.arrowImageView.transform = CGAffineTransformMakeRotation(M_PI * 180);

            lowerDrawer = YES;
        
     completion:^(BOOL finished) 
        //
    ];

我什至应该如何开始调试呢?我可以做些什么来确保集合视图在加载新单元格时不会改变其框架?

【问题讨论】:

我会扫描代码以查找其他可能调整tableView.frame 的内容。另外,您有任何自动布局限制吗? 我没有任何限制,但是在文件检查器的 Storyboard 的 Interface Builder 文档设置中取消选中 Use Auto Layout 是有效的!我不敢相信,昨晚我花了几个小时试图调试它。谢谢!如果您将其写为并回答,我会将其标记为已接受。 完成。很高兴你能弄明白 【参考方案1】:

看起来这是您手动设置的坐标与情节提要文件自动设置的坐标之间的冲突。

尝试检查您可能拥有的任何自动约束,或取消选中 Storyboard Interface Builder 中的“使用自动布局”。

【讨论】:

以上是关于滚动 UICollectionView 会导致父 UIView 中的 UITableView 将 Collection View 推出 Frame的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView CellForItemAt 在滚动时被多次调用,导致单元格文本重叠

UICollectionView 最初滚动跳跃

滚动 UICollectionView 使用大量内存导致崩溃

仅当父滚动视图到达结束时滚动子滚动视图

在 UICollectionView 单元格中单击 WKWebView 会导致未调用回调

当 URL 包含片段时,iframe 会导致父元素在 Google Chrome 上向上滚动