如何在 iOS 8 中将 UIVisualEffectView 添加到 UINavigationBar?

Posted

技术标签:

【中文标题】如何在 iOS 8 中将 UIVisualEffectView 添加到 UINavigationBar?【英文标题】:How to add UIVisualEffectView to UINavigationBar in iOS 8? 【发布时间】:2014-09-26 07:58:32 【问题描述】:

我想使用 UIVIsualEffectView 给导航栏添加模糊效果。我有如下自定义导航栏类​​。头文件

#import <UIKit/UIKit.h>

@interface GSNavigationBar : UINavigationBar
@end

实现文件如下所示

#import "GSNavigationBar.h"

@implementation GSNavigationBar

- (void) awakeFromNib 

     UIVisualEffectView *visualEffectView = [[UIVisualEffectView alloc] initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleExtraLight]];
     visualEffectView.frame = CGRectMake(0, -21, self.frame.size.width , self.frame.size.height + 21);
     [self setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
     [self insertSubview:visualEffectView atIndex:1000];

@end

通过上面的代码,我可以实现导航栏的模糊效果。在推动视图控制器时(通过使用“Push”segue),导航栏中的左栏按钮项和右栏项变为非活动状态。为了更清楚,我附上了视图控制器的屏幕截图。 This is view controller #1. All navigation item buttons are clickable This is view controller #2. We land up here due to push segue from view controller #1. Navigation item buttons are NOT clickable. Also the title goes missing. I had set the title using self.title

【问题讨论】:

为什么要在导航栏添加一个空图像?导航栏已经有模糊效果,你应该使用它。 【参考方案1】:

带有translucent = YES 的NavigationBar 已经具有模糊效果。

所以就用它吧。

【讨论】:

我修改了代码添加当前我的代码看起来像 - (void) awakeFromNib self.translucent = YES; 不会产生预期的效果。我在这里错过了什么吗? 它应该适用于简单的 - (void)awakeFromNib self.translucent = YES; 对不起 self.translucent = YES;没有产生预期的效果。 可以通过设置控制navigationBar的颜色,self.tintColor = [UIColor someColor];也许这会对你有所帮助 不。 tintColor 改变 UIBarButtons 的颜色。我已经尝试了所有 barTint、tintColor、backgroundColor 以及颜色的不同 alpha。添加 UIVisualEffectView 提供了我正在寻找的完美效果。【参考方案2】:

这是为了让导航栏完全透明,如果你有模糊的背景相信它会是你需要的效果。

斯威夫特:

func setupNavigationBar() 
    navigationController!.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
    navigationController!.navigationBar.shadowImage = UIImage()
    navigationController!.navigationBar.translucent = true

目标 C:

- (void) setupNavigationBar
    [self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];

    self.navigationController.navigationBar.shadowImage = [UIImage new];
    self.navigationController.navigationBar.translucent = YES;

【讨论】:

【参考方案3】:
[self sendSubviewToBack:visualEffectView];

【讨论】:

【参考方案4】:

在 UIVisualEffect 上将属性 UserInteractionEnabled 设置为 NO(在 swift 中为 false)。

所以你应该添加你的代码:

visualEffectView.userInteractionEnabled = NO

这应该使您的 navigationItems 左右可用

【讨论】:

以上是关于如何在 iOS 8 中将 UIVisualEffectView 添加到 UINavigationBar?的主要内容,如果未能解决你的问题,请参考以下文章

如何:在 iOS App Objective C iOS 8 中将本地 MP4 视频作为背景

无法在 iOS 8 中将搜索栏色调更改为透明

在 iOS 8 中将应用程序的无处不在的容器暴露给 iCloud Drive

在 ios 8 中将集合或表格视图或自定义视图添加到滚动视图

在 iOS 8 中将 ViewController 的 View 作为子视图添加到 UIPageViewController 会在显示/隐藏时产生奇怪的 UINavigationBar

如何在 Eclipse 中将 checkstyle 降级到 8.40 或 8.41