hoe je een venster krijgt met een semi-transparante vage achtergrond

I'd like to get a window that has a semi-transparent blurred background, just like what the Terminal can do. See this video, about 30 sec in, to see what I mean: http://www.youtube.com/watch?v=zo8KPRY6-Mk

See an image here: http://osxdaily.com/wp-content/uploads/2011/04/mac-os-x-lion-terminal.jpg

Ik ben een uur aan het googlen geweest en kan niets krijgen om te werken. Ik geloof dat ik op de een of andere manier een kernanimatielaag moet maken en een achtergrondfilter moet toevoegen, maar ik heb tot nu toe geen succes ... Ik zie gewoon de grijze achtergrond van mijn venster. Dit is de code die ik tot nu toe heb gekregen:

Code:

//  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]];

Hebt u tips of voorbeelden om te doen wat ik probeer te doen? Bedankt!

7
U bent op zoek naar iets dat HUD-venster heet! Probeer op Google te zoeken, het zal u helpen
toegevoegd de auteur TeaCupApp, de bron
Er is nu een werkende oplossing in recente versies van OSX/Xcode: stackoverflow.com/questions/41475551/…
toegevoegd de auteur Béatrice Cassistat, de bron
Eerlijk gezegd, ik betwijfel of de vervaging gemakkelijk mogelijk is zonder private API's. Bijv. stackoverflow.com/questions/5901135/…
toegevoegd de auteur Vervious, de bron
bedankt, maar ik krijg nog steeds niet veel. verschillende veelbelovende forumberichten gevonden, maar gewezen op voorbeelden of blogberichten die niet meer bestaan.
toegevoegd de auteur Scott C, de bron

3 antwoord

Gebruik de suggestie van Jiulong Zhao voor de transparantie.

Gebruik dit voor een onscherpe achtergrond

De oproep op een NSWindow:

[self enableBlurForWindow:self];

De functie :

-(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: het maakt gebruik van een private API

3
toegevoegd
toegevoegd de auteur Jesus, de bron
Gebruik deze oplossing niet. Mijn app is afgewezen vanwege het gebruik van deze API.
toegevoegd de auteur Mrug, de bron
Ja, goede manier! En ziet eruit als App Store veilig.
toegevoegd de auteur Jiulong Zhao, de bron
Hoe kan het app-winkel veilig opslaan wanneer het privé-API's gebruikt?
toegevoegd de auteur strange, de bron
een oplossing zonder privé api te gebruiken?
toegevoegd de auteur Wojtek, de bron

geen noodzaak voor lagen en filters, NSWindow kan het zelf

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

gebruik dit alsjeblieft niet, omdat het ook je titelbalk alfa zal zijn (plaats het hier voor het geval dat anderen het nodig hebben)

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

enter image description here

3
toegevoegd
Dat is raar, de eerste methode werkt niet voor mij (doe het in de init). Ook geprobeerd in awakeFromNib, waar anders moet ik dit doen (ik ben in een nswindow-subklasse)
toegevoegd de auteur Wesley, de bron
nee, het enige dat u mag controleren, is de transparantie (kleurrijk).
toegevoegd de auteur Jiulong Zhao, de bron
Geen wazig effect hier, toch?
toegevoegd de auteur Raffael, de bron
Met MacOS Terminal kunnen we de kracht van de vervaging instellen. Je zegt dat we dat niet kunnen doen tenzij we ons verdiepen in het domein van private kaders? Hoe bereikt Terminal dat effect?
toegevoegd de auteur AndreG, de bron

Voor diegenen die dit in 2017 lezen en Swift 4 gebruiken en je BG Alpha willen wijzigen, kun je het volgende toevoegen aan je aangepaste NSWindow-klasse:

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

postscriptum Ik heb het blur-effect nog niet nodig en als ik dat doe, zal ik het antwoord bijwerken

0
toegevoegd