在UIButton上的透明imageView图像后面插入UIVisualEffectView

时间:2017-04-04 16:10:11

标签: ios swift uibutton uivisualeffectview

我尝试创建一个背景清晰的按钮,并在按钮上的透明图像后面显示UIVisualEffectViewmyButton.imageView.image有一个图像集(myPNGWithTransparentBackground)。

我认为这很简单,但事实证明它比我想象的要困难......这就是我尝试过的事情:

let frost = UIVisualEffectView(effect: UIBlurEffect(style: .light))
frost.frame = button.bounds
frost.autoresizingMask = [.flexibleWidth, .flexibleHeight]
// button.insertSubview(frost, at: 0)
// button.insertSubview(frost, at: button.subviews.startIndex)
// button.insertSubview(frost, at: button.subviews.endIndex)
// button.imageView?.insertSubview(frost, at: (button.imageView?.subviews.endIndex)!)
button.imageView?.insertSubview(frost, at: (button.imageView?.subviews.startIndex)!)

无论我放在insertSubview的哪个位置,它总是在UIButton的imageView.image前面。

enter image description here

更新

Here's a Git repo我尝试过的事情。子类名为" FrostyButton"。

2 个答案:

答案 0 :(得分:1)

在查看演示项目后,您似乎需要在UIButton图像的顶部上添加imageView 。这是我调整过的代码 - 随时根据需要清理它!

private var imageView2 = UIImageView()  // declared globally

private func makeItFrosty() {
    let frost = UIVisualEffectView(effect: UIBlurEffect(style: .light))
    frost.frame = self.bounds
    frost.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    if let imageView = imageView {
        imageView.addSubview(frost)
        // these three lines basically 'clone' the existing imageView and adds it on top of the 'frost' view
        imageView2.image = imageView.image
        imageView2.frame = imageView.frame
        self.addSubview(imageView2)
    }
}

我不会太惊讶你需要做这样的事情 - UIButton图像可能深深地嵌入“带到前面”。

答案 1 :(得分:0)

不确定是什么问题,但我的自定义按钮类工作......我试图将按钮与一些香草UIViews匹配,并且在UIView的背景上调整alpha并没有削减它。这是我提出的课程。

我最后将UIVisualEffectView放在UIView里面,我卡在按钮内。 isEnabled在可见和不可见之间切换。我在一个有几个按钮的类中使用它,其中只有一个按钮一次运行。

import UIKit

@IBDesignable class FrostyButton: UIButton {

    @IBInspectable override var isEnabled: Bool {
        didSet {
            if isEnabled {
                self.visualEffectContainer.alpha = 1.0
            }
            else {
                let animator = UIViewPropertyAnimator(duration: 0.5, curve: .linear, animations: {
                    self.visualEffectContainer.alpha = 0.0
                })
                animator.startAnimation()
            }
        }
    }

    @IBInspectable var cornerRadius: CGFloat {
        get {
            return layer.cornerRadius
        }

        set {
            layer.cornerRadius = newValue
            layer.masksToBounds = newValue > 0
        }
    }

    private let visualEffectContainer = UIView()

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.backgroundColor = .clear
        makeItFrosty()
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
    }

    private func makeItFrosty() {

        let effectView = UIVisualEffectView(effect: UIBlurEffect(style: .light))
        effectView.frame = self.bounds
        effectView.clipsToBounds = true
        effectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]

        visualEffectContainer.frame = self.bounds
        visualEffectContainer.clipsToBounds = true
        visualEffectContainer.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        visualEffectContainer.addSubview(effectView)
        visualEffectContainer.isUserInteractionEnabled = false
        if imageView != nil {
            self.insertSubview(visualEffectContainer, at: 0)
        }
    }
}