View Debug 中的 Collection View Frame 与代码不同

Posted

技术标签:

【中文标题】View Debug 中的 Collection View Frame 与代码不同【英文标题】:Collection View Frame in View Debug is different from code 【发布时间】:2018-06-14 09:28:16 【问题描述】:

当通过 View Debug 调试自定义 UICollectionView 时,它的宽度是 829,但是当通过代码访问它的宽度时,它的宽度是 820。我错过了什么?

可视化调试:

代码:

func collectionView(_ collectionView: UICollectionView, layout: UICollectionViewLayout, sizeForItemAt: IndexPath) -> CGSize
    
        let widthForCulculation = self.frame.size.width // 820.0
        ...
        return CGSize(width: segmentWidth, height: segmentHeight)
    

【问题讨论】:

检查单元格之间的空格看这里***.com/a/35656724/9315978 您应该使用collectionView.bounds.size.width 而不是self.frame.size.width @vacawama :边界和框架之间的唯一区别是原点,框架的值是相对于/相对于 parentView 计算的,而在边界的情况下,它总是相对于自身计算。因此边界原点始终为 0,0。但无论你使用哪一个,高度和宽度总是相同的。所以在这种情况下,使用 frame 或 bounds 不会有任何区别。让我知道我是否错了 @SandeepBhandari,如果 1)您正在查看同一对象的 bounds 和 frame,则为真,2)对象未旋转(如果旋转,框架变宽,但边界不会改变)。但是,在这种情况下,self 指的是 viewController 的 viewcollectionView 是它的子视图之一,因此总是期望它们具有相同的大小是不合理的。 @vacawama self.frame.size.width 和 collectionView.bounds.size.width 是一样的 【参考方案1】:

相当老套的方式,但在布局子视图时尝试使布局无效

var width : CGFloat = 0
override func layoutSubviews() 
   super.layoutSubviews()
   if (self.width != self.frame.size.width)
   
       self.width = self.frame.size.width
       self.collectionViewLayout.invalidateLayout()
   

【讨论】:

以上是关于View Debug 中的 Collection View Frame 与代码不同的主要内容,如果未能解决你的问题,请参考以下文章

从 Collection View Xcode 中删除 Collection View Cell

如何在 iOS Swift 中显示库中的实时照片视频并在 Collection-View 中显示?

Collection View Xib Cell Bug 中的表视图

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

Xamarin Forms Collection View Extra Padding

通过 Collection View Cell Swift 中的 segue 将图像传递给另一个视图控制器