如何创建具有半透明/模糊背景的优胜美地风格的视图?

Kor*_*nel 32 macos interface-builder nsview osx-yosemite

在约塞米蒂,侧边栏具有半透明的"活力"背景.如何在10.10/Xcode 6中创建类似的视图?

我可以给出任何观点这样的背景吗?我发现NSOutlineView当你给它"源列表"突出显示样式时会默认为这样的背景,但Calendar.app中的侧边栏似乎不是NSOutlineView,所以我想知道是否有一个通用的解决方案.

在此输入图像描述

Kor*_*nel 45

w00t!我找到了使用尚未记录的视图类型的示例代码:

  1. 将XIB的部署目标设置为10.10
  2. 嵌入你的观点 NSVisualEffectView
  3. 在Interface Builder的设置中,视图集外观为"Vibrant Light/Dark".还有其他选项,例如混合"Behind Window"或"Ins​​ide Window"(后者需要图层).

还有NSView一种方法allowsVibrancy可以覆盖返回YES,但由于我还不明白的原因,我的情况并没有启用活力.

  • `allowsVibrancy`用于更改视图在使用vibrancy的视图层次结构中绘制的方式; 它没有做充满活力的背景本身. (5认同)

Con*_*lon 20

随着Yosemite版OSX操作系统的推出,Apple 向Cocoa窗口和窗口组件引入了一种名为vibrancy的新模式,这是一种光扩散模糊.这有点像通过淋浴门看,并使用NSVisualEffectView.Apple 在这里解释了这个效果.

我在NSView上使用这个类别.只需打电话给您想要充满活力的视图.它也与优胜美地前向兼容.(如果你有一个前约塞米蒂,你将看不到效果)

@implementation NSView (HS)

-(instancetype)insertVibrancyViewBlendingMode:(NSVisualEffectBlendingMode)mode
{
    Class vibrantClass=NSClassFromString(@"NSVisualEffectView");
    if (vibrantClass)
    {
        NSVisualEffectView *vibrant=[[vibrantClass alloc] initWithFrame:self.bounds];
        [vibrant setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable];
        // uncomment for dark mode instead of light mode
        // [vibrant setAppearance:[NSAppearance appearanceNamed:NSAppearanceNameVibrantDark]];
        [vibrant setBlendingMode:mode];
        [self addSubview:vibrant positioned:NSWindowBelow relativeTo:nil];

        return vibrant;
    }

    return nil;
}

@end
Run Code Online (Sandbox Code Playgroud)

来自@Volomike的详细说明关注......

如何使用

  1. 添加AppKit.framework到您的项目设置>构建阶段> 链接二进制与图书馆,以便它可以识别NSVisualEffectView.

  2. 做一个出口委托你的主窗口的默认视图,而不是窗口本身,你AppDelegate.m或AppDelegate.mm文件.(如果您是新手,请阅读本教程.)出于此目的,我们假设您将其命名为mainview,然后在代码中可以寻址_mainview.

  3. 在项目中包含该类别.如果您是新手,请@implementationAppDelegate.m或AppDelegate.mm文件中的任何行之前添加类别.

  4. 在您的AppDelegate.m或AppDelegate.mm文件@implementation AppDelegate,在您的applicationDidFinishLaunching类方法中,添加以下代码行:

[_mainview insertVibrancyViewBlendingMode:NSVisualEffectBlendingModeBehindWindow];
Run Code Online (Sandbox Code Playgroud)
  1. 现在你需要学习如何添加一些代码来给出窗口上的其他元素,以及窗口本身的半透明度.这种半透明效果将允许此效果显示在您需要的窗口组件中.这在这里解释.

现在的净效果是,标题栏下方的整个窗口,或者只有你想要的部分(如侧边栏),都会显示出这种活力效果.