【问题标题】:Highlighting UIButton with blur background causes loss of transparency使用模糊背景突出显示 UIButton 会导致透明度丢失
【发布时间】:2018-09-09 19:40:29
【问题描述】:

我有一个 UIButton,我给它一个模糊和变暗的背景。但是,当我突出显示它时(按下它但不释放按钮),它会因添加似乎不透明的图层而失去透明度。

这是它的视频;问题在几秒钟后开始:https://imgur.com/a/B9w52nZ

我的自定义按钮类如下所示:

override func layoutSubviews() {
    super.layoutSubviews()
    let blur = UIVisualEffectView(effect: UIBlurEffect(style: .regular))
    blur.frame = self.bounds
     blur.isUserInteractionEnabled = false
     self.insertSubview(blur, at: 0)
}

使用:Swift 4、iOS 12 测试版构建

这里有什么问题以及解决它的最佳方法是什么?

【问题讨论】:

  • 请阅读minimal reproducible example 然后edit 你的问题显示了演示问题的最小代码 - 一个工作示例,删除对我们看不到的代码的引用,或不影响手头问题的代码。
  • 您的按钮是在代码中还是在故事板中创建的?
  • 它在故事板中。问题在于使用 layoutSubviews(),因为它在按钮的生命周期内被多次调用。下面的答案反映了这一点。

标签: ios swift uibutton uiblureffect


【解决方案1】:

正如您提到的,layoutSubviews 被多次调用。

由于您的按钮是在情节提要中创建的,因此您可以移动代码以将模糊添加到

func awakeFromNib()

每个从 xib 或故事板文件创建的对象只调用一次此方法,

您应该使用自动布局(添加布局约束)对UIVisualEffectView 进行布局,或者在layoutSubviews() 中调整它的框架

【讨论】:

  • 更新了我的答案
【解决方案2】:

layoutSubviews() 被多次调用,包括按钮被突出显示时。因此,每次都添加模糊。我添加了逻辑来防止这种情况,解决了问题。新代码:

var isBlurred = false

override func layoutSubviews() {
    super.layoutSubviews()
    if !isBlurred {
        let blur = UIVisualEffectView(effect: UIBlurEffect(style:
            .regular))
        blur.frame = self.bounds
        blur.isUserInteractionEnabled = false
        self.insertSubview(blur, at: 0)
        isBlurred = true
    }
}

这有点快速和肮脏,但它解决了问题。

【讨论】:

    猜你喜欢
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 2018-04-06
    • 1970-01-01
    • 2012-10-01
    相关资源
    最近更新 更多