2016-05-14 15 views
5

È possibile regolare il raggio di sfocatura e la trasparenza di un NSVisualEffectView quando è applicato a un NSWindow (Swift o Objective-C)? Ho provato tutte le varianti di NSVisualEffectMaterial (scuro, medio, leggero) - ma non lo sto tagliando. Nell'immagine seguente ho utilizzato l'API non pubblica di Apple con CGSSetWindowBackgroundBlurRadius a sinistra e NSVisualEffectView a destra.Regola NSVisualEffectView sfocatura raggio e trasparenza

enter image description here

sto cercando di ottenere l'aspetto di ciò che è a sinistra, ma sembra io sono relegato a utilizzare i metodi della destra.

Ecco il mio codice:

blurView.blendingMode = NSVisualEffectBlendingMode.BehindWindow 
blurView.material = NSVisualEffectMaterial.Medium 
blurView.state = NSVisualEffectState.Active 
self.window!.contentView!.addSubview(blurView) 

Possibilmente, relativo - ma non risponde alla mia domanda:

risposta

2

Anche se io non consiglierei questo a meno che tu non sia pronto a ricorrere ad esso non funzionando in una versione futura, puoi creare una sottoclasse di NSVisualEffectView con quanto segue per fare ciò che vuoi:

- (void)updateLayer 
{ 
    [super updateLayer]; 

    [CATransaction begin]; 
    [CATransaction setDisableActions:YES]; 

    CALayer *backdropLayer = self.layer.sublayers.firstObject; 

    if ([backdropLayer.name hasPrefix:@"kCUIVariantMac"]) { 
     for (CALayer *activeLayer in backdropLayer.sublayers) { 
      if ([activeLayer.name isEqualToString:@"Active"]) { 
       for (CALayer *sublayer in activeLayer.sublayers) { 
        if ([sublayer.name isEqualToString:@"Backdrop"]) { 
         for (id filter in sublayer.filters) { 
          if ([filter respondsToSelector:@selector(name)] && [[filter name] isEqualToString:@"blur"]) { 
           if ([filter respondsToSelector:@selector(setValue:forKey:)]) { 
            [filter setValue:@5 forKey:@"inputRadius"]; 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 

    [CATransaction commit]; 
} 

Anche se questo non fa uso di API private di per sé, si avvia a scavare nelle gerarchie di livello che non si è proprietari, in modo da assicurarsi di verificare che cosa state ottenendo indietro è quello che ci si aspetta, e fallire con grazia se non Ad esempio, su 10.10 Yosemite, il livello Backdrop era un decedent diretto della vista Effetto visivo, quindi è probabile che le cose cambino in futuro.

+0

Ciao, grazie per la risposta, ma sfortunatamente questo non sembra aggiustare la trasparenza. –

+0

Questo esempio era per le sfocature della finestra, quindi potrebbe essere necessario esplorare la gerarchia dei livelli per ottenere il particolare livello desiderato. Imposta un punto di interruzione in 'updateLayer', e chiama continuamente' po self.layer.sublayers' per vedere che cosa hai bisogno di cercare nella vista dell'effetto visivo. Convenientemente, la maggior parte dei livelli ha un nome, quindi è possibile eseguire il drill down a poco a poco in questo modo. Credo che ci sia un altro livello chiamato "Tinta" che controlla anche la tinta del colore. –