ImageView 渐变行为异常

Posted

技术标签:

【中文标题】ImageView 渐变行为异常【英文标题】:ImageView Gradient behaving abnormally 【发布时间】:2017-10-29 18:16:08 【问题描述】:

我将渐变(透明 - 黑色)应用于图像视图,在它上面我有一个浮动按钮。一切正常。唯一的问题是,每当点击浮动按钮时,渐变开始越来越多地增加到黑色。我的渐变从上到下清晰到黑色。但在互动时,它开始慢慢变黑。

我真的无法解决这个错误。

此图像视图位于 UIcollectionResuableView 中。以下是您关注的代码。

func addBlackGradientLayerprof(frame: CGRect)
    let gradient = CAGradientLayer()
    gradient.frame = frame
    let black = UIColor.init(red: 0/255, green: 0/255, blue: 0/255, alpha: 0.65).cgColor
    gradient.colors = [UIColor.clear.cgColor, black]
    gradient.locations = [0.0, 1.0]
    self.layer.addSublayer(gradient)

带有浮动按钮的标题视图:

override func layoutSubviews() 
    super.layoutSubviews()
    profilePic.addBlackGradientLayerprof(frame: profilePic.bounds)


override func awakeFromNib() 
    super.awakeFromNib()
    layoutFAB()



func layoutFAB() 
    floaty.openAnimationType = .slideDown

    floaty.addItem("New Post", icon: UIImage(named: "photo-camera"))  item in
        self.delegate.fabUploadClicked()
    
    floaty.addItem("Settings", icon: UIImage(named: "settingsB"))  item in
        self.delegate.fabSettingsClicked()
    
    floaty.paddingY = (frame.height - 30) - floaty.frame.height/2
    floaty.fabDelegate = self
    floaty.buttonColor = UIColor.white
    floaty.hasShadow = true
    floaty.size = 45
    addSubview(floaty)



【问题讨论】:

点击按钮时会调用什么代码?您是否不止一次致电addBlackGradientLayerprof 是的!我不知道为什么,但由于某种原因,当视图加载以及关闭浮动按钮时,layoutSubviews() 会被调用两次。 @LeoDabus 那太完美了。问题已解决 @LeoDabus 这个问题不是重复的。这个问题的背景是找出为什么我有多层渐变而不是如何有渐变。答案确实给了我另一个解决我的问题的方法,它没有解决它。我要求您删除重复的标志,因为这会误导其他用户。 【参考方案1】:

layoutSubviews 不适合做任何事情,除了根据需要调整几帧。它可以在视图的生命周期中被多次调用。您不应该从layoutSubviews 添加图层。

您应该从一个保证在对象的生命周期内只被调用一次的地方调用addBlackGradientLayerprofawakeFromNib 是一个可能的地方。

【讨论】:

我试过了。但这会导致梯度无法成功覆盖图像的问题。我什至在这里发布了一个关于它的问题。 ***.com/questions/46753710/… layoutSubviews你可以调整图层的框架。只是不要添加另一个。 好吧,正如我所见。我只是添加一个对吗?我只是调用框架一次。我在这里想念什么。我该如何处理? layoutSubviews 可以被多次调用,包括视图框架发生变化时以及其他时间。这就是您不想从layoutSubviews 添加新层的原因。但是由于视图的框架可以改变,您需要更新图层的框架以匹配。 嘿,问题解决了。并感谢您的帮助。我在我的许多 VC 中都调用了 LayoutSubviews。这让我指出了其他几个错误并解决了它们

以上是关于ImageView 渐变行为异常的主要内容,如果未能解决你的问题,请参考以下文章

ImageView 上的渐变层重用

如何向嵌套在折叠工具栏中的 ImageView 添加渐变

将淡化边应用于ImageView

UIView 添加闪烁的渐变光

UIButton 子类中的 imageview.transform 奇怪的行为

如何使用 Imageview 实现切换行为,没有 UIButton