Вопрос по cocoa, macos, nswindow, calayer – как получить окно с полупрозрачным размытым фоном

7

Я хотел бы получить окно с полупрозрачным размытым фоном, точно так же, как это может делать Терминал. Посмотрите это видео примерно через 30 секунд, чтобы понять, что я имею в виду:http://www.youtube.com/watch?v=zo8KPRY6-Mk

Смотрите изображение здесь:http://osxdaily.com/wp-content/uploads/2011/04/mac-os-x-lion-terminal.jpg

Я в течение часа гуглял и не могу заставить что-либо работать. Я считаю, что мне нужно как-то создать основной слой анимации и добавить фоновый фильтр, но я до сих пор не добился успеха ... Я просто вижу серый фон моего окна. Вот код, который я до сих пор получил:

Код:

//  Get the content view -- everything but the titlebar.
NSView *theView = [[self window] contentView];
[theView setAlphaValue:0.5];

// Create core animation layer, with filter
CALayer *backgroundLayer = [CALayer layer];
[theView setWantsLayer:YES];
[theView setLayer:backgroundLayer]; 
CIFilter *blurFilter = [CIFilter filterWithName:@"CIGaussianBlur"];
[blurFilter setDefaults];
[theView layer].backgroundFilters = [NSArray arrayWithObject:blurFilter];  
[[theView layer] setBackgroundFilters:[NSArray arrayWithObject:blurFilter]];

Какие-нибудь советы или примеры, чтобы сделать то, что я пытаюсь сделать? Спасибо!

В последних версиях OSX / Xcode есть работающее решение:stackoverflow.com/questions/41475551/… Béatrice Cassistat
Вы ищете что-то под названием окно HUD! Попробуйте поискать в Google, это поможет вам TeaCupApp
Честно говоря, я сомневаюсь, что размытие легко возможно без частных API. Например.stackoverflow.com/questions/5901135/… Vervious
спасибо, но я все еще не получаю много. нашел несколько многообещающих сообщений на форуме, но указал на примеры или сообщения в блоге, которые больше не существуют. Scott C

Ваш Ответ

3   ответа
0

Для тех, кто читает это в 2017 году и используетSwift 4 и желая изменить свой BGAlpha Вы можете добавить следующее в свой пользовательский класс NSWindow:

self.backgroundColor = NSColor.black
self.backgroundColor = NSColor.init(calibratedHue: 0, saturation: 0, brightness: 0, alpha: 0.2)

постскриптум Мне пока не нужен эффект размытия, и когда я это сделаю, я обновлю ответ

3

Для прозрачности используйте предложение Jiulong Zhao.

Для размытого фона используйте это

Вызов NSWindow:

[self enableBlurForWindow:self];

Функция :

-(void)enableBlurForWindow:(NSWindow *)window
{
    //!!!! Uses private API - copied from http://blog.steventroughtonsmith.com/2008/03/using-core-image-filters-onunder.html

    CGSConnection thisConnection;
    uint32_t compositingFilter;
    int compositingType = 1; // Under the window

    /* Make a new connection to CoreGraphics */
    CGSNewConnection(NULL, &thisConnection);

    /* Create a CoreImage filter and set it up */
    CGSNewCIFilterByName(thisConnection, (CFStringRef)@"CIGaussianBlur", &compositingFilter);
    NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithFloat:2.0] forKey:@"inputRadius"];
    CGSSetCIFilterValuesFromDictionary(thisConnection, compositingFilter, (__bridge CFDictionaryRef)options);

    /* Now apply the filter to the window */
    CGSAddWindowFilter(thisConnection, [window windowNumber], compositingFilter, compositingType);
}

NB: он использует частный API

Насколько это безопасно для магазина приложений, когда он использует частные API?
Не используйте это решение. Мое приложение отклонено из-за использования этого API.
cocoasnippets.io/cocoa/ui/nswindow/coregraphics/2014/02/27/… эта ссылка все еще работает
какое-то решение без использования частного API?
Да, хорошо! И выглядит как безопасный App Store.
3

нет необходимости в слоях и фильтрах, NSWindow может сделать это сам

[mywindow setOpaque:NO];
[mywindow setBackgroundColor: [NSColor colorWithCalibratedHue:0.0 saturation:0.0 brightness:0.2 alpha:0.5]];

пожалуйста, не используйте это, так как оно также будет отображаться в строке заголовка (опубликуйте его на всякий случай, если это нужно другим)

[mywindow setOpaque:NO];
[mywindow setBackgroundColor: [NSColor blackColor]];
[mywindow setAlphaValue:0.5];

enter image description here

Здесь нет эффекта размытия, верно?
нет, единственное, что вы можете контролировать, это прозрачность (красочная).
Это странно, первый метод не работает для меня (делает это в init). Также пробовал в awakeFromNib, где еще я должен сделать это (я в подклассе nswindow)
Таким образом, терминал MacOS позволит нам установить силу размытия. Вы говорите, что мы не сможем этого сделать, если не углубимся в сферу частных структур? Как Терминал достигает этого эффекта?

Похожие вопросы