Swift - UICollectionReusableView 的子视图不适合宽度

Posted

技术标签:

【中文标题】Swift - UICollectionReusableView 的子视图不适合宽度【英文标题】:Swift - subview of UICollectionReusableView doesn't fit with width 【发布时间】:2017-11-30 14:52:34 【问题描述】:

我有一个带有 UICollectionReusableView(标题)的 UICollectionViewController。 在这个 UICollectionReusableView 中,我有一个子视图(粉红色)。

我已经为子视图设置了一些约束,即全屏宽度。

它非常适合背景 img(黑色)。但是,关于子视图,它仅适用于 iPhone 6 尺寸(例如,对于 iPhone 5s 来说太大,对于 iPhone 6 plus 来说不够)。我真的不知道为什么它适用于背景图像而不适用于这个子视图。粉红色的子视图是“Radius View on Top”,背景中的图像是“Ban img”。

我尝试在 UICollectionReusableView 的 awakeFromNib() 中对此进行编码

let width = UIScreen.main.bounds.size.width
self.widthConstraintRadiusView.constant = width

编辑

我发现了一些东西:

我可以看到子视图有正确的宽度,但它没有被拉伸?这怎么可能?我必须了解什么?

编辑 2

如果我在子视图上使用函数 roundCorners,它就不起作用:

func roundCorners(_ corners:UIRectCorner, radius: CGFloat) 
      let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
      let mask = CAShapeLayer()
      mask.path = path.cgPath
      self.layer.mask = mask
   

radiusViewOnTop.roundCorners([.topLeft,.topRight], radius: 7)

我怎样才能保持功能并具有正确的宽度?

【问题讨论】:

页眉视图的其余部分大小是否正确? 我是这么认为的,因为正如我所说,“Ban img”的尺寸非常合适 我建议使用层次结构检查器来查看为什么大小会这样。 仅供参考,问题的屏幕截图通常比问题的屏幕截图更有帮助。 有点混乱...您的粉红色“顶部半径视图”具有前导和尾随约束...您设置的“宽度约束常数”是什么? 【参考方案1】:

根据您的最新编辑,我知道它为什么不起作用,并且这是一个简单的修复。

您的视图尺寸正确,但您添加的蒙版尺寸错误。

您使用 iPhone 6 尺寸设计了界面,这些是加载视图的尺寸。之后,它会在您的视图上执行布局传递,以将大小更新为实际大小。

但是,您可能在 awakeFromNib 或类似的东西上调用圆角方法,这发生在视图加载之后但大小更新之前。

修复很简单,覆盖layoutSubviews,先调用super,再调用roundCorners:方法。

【讨论】:

当我将函数调用到 layoutSubviews 时它不起作用,但如果我将函数调用到 viewForSupplementaryElementOfKind() 中它会起作用 ...

以上是关于Swift - UICollectionReusableView 的子视图不适合宽度的主要内容,如果未能解决你的问题,请参考以下文章

Swift入门系列--Swift官方文档(2.2)--中文翻译--About Swift 关于Swift

swift 示例BS swift.swift

swift swift_bug.swift

ios 整理(一)swift和oc的区别

swift swift_extension5.swift

swift swift_optional4.swift