0

我在故事板上有一个视觉效果视图,连接到我的 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)   

}
4

1 回答 1

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
    }
}
于 2015-03-09T16:46:33.143 回答