突出显示具有模糊背景的 UIButton 会导致透明度丢失

Highlighting UIButton with blur background causes loss of transparency

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

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

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

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 beta

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

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
    }
}

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

如您所述,layoutSubviews 被多次调用。

由于您的按钮是在故事板中创建的,因此您可以移动代码以将模糊添加到

func awakeFromNib()

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

您应该使用自动布局(添加布局约束)对 UIVisualEffectView 进行布局,或者在 layoutSubviews()

中仅调整其框架