Ios 自定义图像视图上的渐变层
这是我第一次尝试将渐变层应用于CustomImageView,为了在UICollectionViewCell中实现这一点,我决定创建以下函数: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
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)。