当 SWRevealViewController 菜单打开时模糊 FontView

Blur the FontView when SWRevealViewController menu opens

我在使用 SWRevealViewController 创建的应用程序中使用了一个幻灯片菜单。现在我想在用户打开菜单时模糊 FrontView 。这怎么可能?我的想法是在 FrontViewController 中有一个 blurView,alpha 值为 0。当用户打开菜单时,alpha 值变为 1。我的问题是当用户打开菜单时是否有一个特定的函数被调用?

如果可能,blurView's alpha 值的变化应与打开菜单的滑动相同:当用户使用 GestureRecognizer 打开菜单时,menuViewController 的移动alpha 值的变化应该相等。

希望你能理解我的问题。 感谢您的帮助!

我一直在研究你的问题,这是我的结果,

首先,在 SWRevealViewControllerDelegate 中,您有 3 种方法可以注意到 revealViewController panGestureRecognizer

func revealController(revealController: SWRevealViewController!, panGestureBeganFromLocation location: CGFloat, progress: CGFloat) {
}

func revealController(revealController: SWRevealViewController!, panGestureMovedToLocation location: CGFloat, progress: CGFloat, overProgress: CGFloat) {
}

func revealController(revealController: SWRevealViewController!, panGestureEndedToLocation location: CGFloat, progress: CGFloat, overProgress: CGFloat) {
}

所以你需要让你的 FrontViewController 成为 SWRevealViewController

的代表

像这样self.revealViewController().delegate = self

然后使用 https://www.raywenderlich.com/84043/ios-8-visual-effects-tutorial 的扩展名 UIImage+ImageEffects 基于教程提供的示例代码,我们可以从 frontViewController.view 创建图像并应用高斯模糊提到类别这是代码

import UIKit

class MainViewController: UIViewController,SWRevealViewControllerDelegate {

    var imageBlur : UIImageView?
    var originalImage : UIImage?
    let maxRadius : CGFloat = 5.0
    let minRadius = 0
    var arrayOfImages : [UIImage]?

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
        self.revealViewController().delegate = self

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        self.originalImage = self.takeSnapShotOfView(self.view)
        self.imageBlur = UIImageView(image: self.originalImage)
        self.view.addSubview(self.imageBlur!)
    }

    func revealController(revealController: SWRevealViewController!, panGestureBeganFromLocation location: CGFloat, progress: CGFloat) {

        let image = self.originalImage
        self.imageBlur?.image = image?.applyFixedBlurWithRadius(CGFloat(progress*self.maxRadius))
    }

    func revealController(revealController: SWRevealViewController!, panGestureMovedToLocation location: CGFloat, progress: CGFloat, overProgress: CGFloat) {
        let image = self.originalImage
        self.imageBlur?.image = image?.applyFixedBlurWithRadius(CGFloat(progress*self.maxRadius))

    }

    func revealController(revealController: SWRevealViewController!, panGestureEndedToLocation location: CGFloat, progress: CGFloat, overProgress: CGFloat) {
        let image = self.originalImage
        self.imageBlur?.image = image?.applyFixedBlurWithRadius(CGFloat(progress*self.maxRadius))

    }

    func revealController(revealController: SWRevealViewController!, willMoveToPosition position: FrontViewPosition) {
        if(position == .Left)
        {
            self.imageBlur?.image = self.originalImage
        }
        if(position == .Right)
        {
            let image = self.originalImage
            self.imageBlur?.image = image?.applyFixedBlurWithRadius(CGFloat(1*self.maxRadius))
        }
    }

    func takeSnapShotOfView(view:UIView) ->UIImage
    {
        UIGraphicsBeginImageContext(CGSizeMake(view.frame.size.width, view.frame.size.height))
        view.drawViewHierarchyInRect(CGRectMake(0, 0, view.frame.size.width, view.frame.size.height), afterScreenUpdates: true)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return image
    }


}

希望对您有所帮助