以编程方式更改现有的UIBlurEffect UIBlurEffectStyle?

时间:2015-02-12 22:00:48

标签: ios swift uiblureffect uivisualeffectview

我在与我的ViewController连接的故事板上有一个视觉效果视图作为插座。效果是在它背后涂抹ImageView并且效果很好。我试图在按钮内点击IBAction将UIBlurEffectStyle从Light更改为Dark。这里的任何帮助将非常感谢!

@IBOutlet weak var blurView: UIVisualEffectView!

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

@IBAction func changeBlurView() {

    // This is wrong, but is my best attempt so far.
    self.blurView(UIBlurEffectStyle.Dark)   

}

1 个答案:

答案 0 :(得分:1)

在创建自己的应用程序时,我遇到了类似的问题。我根本不使用IB,所以一切都是以编程方式完成的。我查看了UIVisualEffectView.h并且它不会动态地提供任何效果更改(希望将来会改变)。

所以这是我的解决方案(我使用的是最新的Swift版本,因此有一个 as!运算符):

class CustomVisualEffectView : UIVisualEffectView
{
    deinit
    {
        println("UIVisualEffectView will be destroyed.")
    }
}

class ViewController: UIViewController
{
    var _blurEffect = UIBlurEffect() // global so you can use it for vibrancy effect view as well
    var _blurredEffectView = CustomVisualEffectView()

    let _someSubView = UIView()
    let _someOtherSubView = UIView()

    let _effectChanger = UIButton.buttonWithType(.System) as! UIButton

    override func viewDidLoad()
    {
        super.viewDidLoad()

        self.view.backgroundColor = UIColor.orangeColor()

        /* create a button to change the effect */
        _effectChanger.setTitle("Change effect!", forState: UIControlState.Normal)
        _effectChanger.frame.size = CGSize(width: 100, height: 20)
        _effectChanger.center = self.view.center
        _effectChanger.addTarget(self, action: Selector("buttonClicked"), forControlEvents: UIControlEvents.TouchUpInside)
        self.view.addSubview(_effectChanger)

        /* here is our effect view */
        _blurEffect = UIBlurEffect(style: self.randomBlurEfffectStyle())
        _blurredEffectView = CustomVisualEffectView(effect: _blurEffect)
        self.layoutEffectView()
        self.view.addSubview(_blurredEffectView)

        /* create two subviews and put them on the effect view */
        _someSubView.frame = CGRectMake(10, 10, 10, 10)
        _someSubView.backgroundColor = UIColor.redColor()
        _blurredEffectView.contentView.addSubview(_someSubView)

        _someOtherSubView.frame = CGRectMake(30, 30, 10, 10)
        _someOtherSubView.backgroundColor = UIColor.greenColor()
        _blurredEffectView.contentView.addSubview(_someOtherSubView)
    }

    func layoutEffectView()
    {
        _blurredEffectView.frame.size = CGSize(width: 100, height: 80)
        _blurredEffectView.center = CGPointMake(_effectChanger.center.x, _effectChanger.center.y - 50)
    }

    func buttonClicked()
    {
        var tempArray = [AnyObject]()

        /* get all subviews from the effect view */
        for view in _blurredEffectView.contentView.subviews
        {
            tempArray.append(view)
            view.removeFromSuperview()
        }
        /* modify your effect view */
        _blurEffect = UIBlurEffect(style: self.randomBlurEfffectStyle())

        /* IMPORTANT: so the old effect view can be destroyed by arc */
        _blurredEffectView.removeFromSuperview()

        _blurredEffectView = CustomVisualEffectView(effect: _blurEffect)
        /* I think this will be really tricky if you will use auto layout */
        self.layoutEffectView()
        self.view.addSubview(_blurredEffectView)

        /* put all subviews back to the effect view*/
        for view in tempArray
        {
            _blurredEffectView.contentView.addSubview(view as! UIView)
        }
    }

    func randomBlurEfffectStyle() -> UIBlurEffectStyle
    {
        let randomBlurEffectStyle : UIBlurEffectStyle

        switch Int(arc4random_uniform(3)) // [0,1,2]
        {
        case 0:
            randomBlurEffectStyle = .ExtraLight
        case 1:
            randomBlurEffectStyle = .Light
        default:
            randomBlurEffectStyle = .Dark
        }

        return randomBlurEffectStyle
    }
}