导航栏的实时模糊效果

Shi*_*ney 31 objective-c uinavigationbar uinavigationcontroller ios swift

如何像iPhone中的预告片应用程序一样实现导航栏的实时模糊效果.

即当您滚动时,内容应该在导航栏后面变得模糊.请帮我一些代码.

谢谢!

我想达到这样的效果: -

在此输入图像描述

Kam*_*pai 41

Apple已经推出了新的UIVisualEffectView类以及更多来为iOS 8.0版本的视图添加半透明和模糊效果.

在这里您可以如何使用它为导航栏或任何其他添加模糊效果UIView:

Swift 2.1编辑

func addBlurEffect() {
    let bounds = self.navigationController?.navigationBar.bounds as CGRect!
    let visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .light))
    visualEffectView.frame = bounds!
    visualEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    self.navigationController?.navigationBar.addSubview(visualEffectView)

    // Here you can add visual effects to any UIView control.
    // Replace custom view with navigation bar in above code to add effects to custom view.
}
Run Code Online (Sandbox Code Playgroud)

目标C代码:

- (void) addBlurEffect {
    // Add blur view
    CGRect bounds = self.navigationController.navigationBar.bounds;
    UIVisualEffectView *visualEffectView = [[UIVisualEffectView alloc] initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]];
    visualEffectView.frame = bounds;
    visualEffectView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    [self.navigationController.navigationBar addSubview:visualEffectView];
    self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];
    [self.navigationController.navigationBar sendSubviewToBack:visualEffectView];

    // Here you can add visual effects to any UIView control.
    // Replace custom view with navigation bar in above code to add effects to custom view.
}
Run Code Online (Sandbox Code Playgroud)

更新:

如果您在navigationBar上添加模糊效果后发现导航按钮不可见,则在添加blurView代码后添加下面的行.

迅速:

self.navigationController?.navigationBar.sendSubview(toBack: visualEffectView)
Run Code Online (Sandbox Code Playgroud)

目标C:

[self.navigationController.navigationBar sendSubviewToBack:visualEffectView];
Run Code Online (Sandbox Code Playgroud)

  • 我的后退按钮是一个箭头和"后退"字母,但现在只有箭头,当我按下它时它不会回来.知道如何解决这个问题吗? (3认同)
  • 我不知道是否有人遇到过这个问题.这样做只会使导航栏模糊,但我的状态栏仍然显示为半透明.有办法解决这个问题吗? (2认同)

neo*_*eye 8

斯威夫特4

extension UINavigationBar {
    func installBlurEffect() {
        isTranslucent = true
        setBackgroundImage(UIImage(), for: .default)
        let statusBarHeight: CGFloat = UIApplication.shared.statusBarFrame.height
        var blurFrame = bounds
        blurFrame.size.height += statusBarHeight
        blurFrame.origin.y -= statusBarHeight
        let blurView  = UIVisualEffectView(effect: UIBlurEffect(style: .light))
        blurView.isUserInteractionEnabled = false
        blurView.frame = blurFrame
        blurView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        addSubview(blurView)
        blurView.layer.zPosition = -1
    }
}
Run Code Online (Sandbox Code Playgroud)

用法

navigationController?.navigationBar.installBlurEffect()
Run Code Online (Sandbox Code Playgroud)


小智 7

注意:在iOS 11上,功能sendSubviewToBack无法正常工作.为了实现这一点,我们应该使用zPosition模糊效果视图放在其他视图下.

self.visualEffectView.layer.zPosition = -1;
Run Code Online (Sandbox Code Playgroud)

Objective-C代码

[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
    self.navigationController.navigationBar.shadowImage = [UIImage new];
    self.navigationController.navigationBar.barTintColor = [UIColor whiteColor];
    self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];
    self.navigationController.navigationBar.translucent = YES;
    // Add blur view
    CGRect bounds = self.navigationController.navigationBar.bounds;
    bounds.size.height += 20;
    bounds.origin.y -= 20;
    _visualEffectView = [[UIVisualEffectView alloc] initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]];
    self.visualEffectView.frame = bounds;
    self.visualEffectView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    self.visualEffectView.userInteractionEnabled = NO;
    self.visualEffectView.layer.zPosition = -1;
    [self.navigationController.navigationBar addSubview:self.visualEffectView];
    [self.navigationController.navigationBar sendSubviewToBack:self.visualEffectView];
Run Code Online (Sandbox Code Playgroud)

Swift 4代码

  self.navigationController?.navigationBar.isTranslucent = true
    self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
    let visualEffectView   = UIVisualEffectView(effect: UIBlurEffect(style: .light))
    var bounds = view.bounds
    bounds.size.height += 20
    bounds.origin.y -= 20
    visualEffectView.isUserInteractionEnabled = false
    visualEffectView.frame = bounds
    visualEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    self.navigationController?.navigationBar.addSubview(visualEffectView)
    visualEffectView.layer.zPosition = -1
Run Code Online (Sandbox Code Playgroud)