Ios 自定义图像视图上的渐变层

Ios 自定义图像视图上的渐变层,ios,swift,frontend,cagradientlayer,Ios,Swift,Frontend,Cagradientlayer,这是我第一次尝试将渐变层应用于CustomImageView,为了在UICollectionViewCell中实现这一点,我决定创建以下函数: func configureGradientOverlay() { let maskedView = UIView(frame: CGRect(x: 0, y: 0.5, width: 400, height: 400)) maskedView.backgroundColor = .black let gradient

这是我第一次尝试将渐变层应用于CustomImageView,为了在UICollectionViewCell中实现这一点,我决定创建以下函数:

func configureGradientOverlay() {
    
    let maskedView = UIView(frame: CGRect(x: 0, y: 0.5, width: 400, height: 400))
    maskedView.backgroundColor = .black

    let gradientMaskLayer = CAGradientLayer()
    gradientMaskLayer.frame = maskedView.bounds
    gradientMaskLayer.colors = [UIColor.clear.cgColor, UIColor.clear.cgColor, UIColor.clear.cgColor, UIColor.white.cgColor]
    gradientMaskLayer.locations = [0, 0.4, 0.6, 0.99]

    maskedView.layer.mask = gradientMaskLayer
    postImageView.addSubview(maskedView)   
}
这似乎可以在“postImageView”上应用渐变覆盖,但正如您所见,我决定将“maskedView”的宽度和高度任意设置为400。理想情况下,我想将宽度和高度设置为“postImageView”的宽度和高度,但当我尝试使用下面的代码进行设置时,渐变覆盖不再显示

let postImageViewSize: CGRect = postImageView.bounds
let postImageViewWidth = postImageViewSize.width
let postImageViewHeight = postImageViewSize.height

let maskedView = UIView(frame: CGRect(x: 0, y: 0.5, width: postImageViewWidth, height: postImageViewHeight))

有人能告诉我我可能做错了什么吗?

在初始化器中使用视图的
边界总是运气好,因为无法保证在访问边界属性时视图将完全绘制。更好的方法是覆盖层的
layoutSublayers(of:)
方法

   override func layoutSublayers(of layer: CALayer) {
      super.layoutSublayers(of: layer)
      gradientMaskLayer.frame = self.bounds
   }

假设您的图层是在视图中创建的,视图会自动将自己指定为图层的代理,从而提供
layoutSublayers(of:)
方法,然后您可以如上所述覆盖该方法。如果未在视图中创建代理,则必须自己设置代理功能。我建议在一个视图内执行:-)

侧翼实际上是正确的。因此,继续并将宽度和高度设置为“PostMageView”的宽度和高度

func configureGradientOverlay() {
    
    let postImageViewSize: CGRect = postImageView.bounds
    let postImageViewWidth = postImageViewSize.width
    let postImageViewHeight = postImageViewSize.height
  
    let maskedView = UIView(frame: CGRect(x: 0, y: 0.5, width: postImageViewWidth, height: postImageViewHeight))
    maskedView.backgroundColor = .black

    maskedView.layer.mask = gradientMaskLayer
    postImageView.addSubview(maskedView)
}
然后调用
layoutSublayers
中的
configureGradientOverlay

override func layoutSublayers(of layer: CALayer) {
    super.layoutSublayers(of: layer)
    
  let gradientMaskLayer = CAGradientLayer()
          gradientMaskLayer.frame = maskedView.bounds
          gradientMaskLayer.colors = [UIColor.clear.cgColor, UIColor.clear.cgColor, UIColor.clear.cgColor, UIColor.white.cgColor]
          gradientMaskLayer.locations = [0, 0.4, 0.6, 0.99]

          maskedView.layer.mask = gradientMaskLayer
}


编辑(除了代码之外),此处的
positmageviewheight
将为零,除非您在
didLayoutSubviews()
或其他内容中计算高度。

您从哪里调用此代码?如果postimageview未完全初始化和显示,则其边界将不准确。您可以在final语句上放置一个断点,并检查属性是否符合您的预期。此函数在init函数的addSubview(positmageview)之后调用。可能是因为postImageView在函数运行时没有完全初始化(即使它放在addSubview(postImageView)之后)?初始化中的寻址边界总是有风险的,因为无法保证视图已经完成绘制。我将放弃我的方法(不确定它是否是最好的!0)。