2016-05-14 21 views
5

NSWindow (Swift veya Objective-C) uygulandığında, NSVisualEffectView'un bulanıklık yarıçapı ve saydamlığını ayarlamak mümkün mü? NSVisualEffectMaterial (karanlık, orta, aydınlık) tüm varyasyonlarını denedim - ama bu onu kesmiyor. Aşağıdaki resimde, Apple'ın kamusal olmayan API'sini solda CGSSetWindowBackgroundBlurRadius ve sağda NSVisualEffectView ile kullandım. NSVisualEffectView öğesinin bulanıklık yarıçapı ve saydamlığını ayarlayın

enter image description here

ben solda ne görünümünü elde etmek çalışıyorum, ama ben hakkının yöntemleri kullanmak indirileceği olduğum gibi görünüyor. ilgili, Muhtemelen

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

- ama soruma cevap vermez: Burada

kodum var

cevap

2

Geleceğe yönelik bir sürümde çalışmaya devam etmeye hazır değilseniz, istediğiniz şeyi yapmak için NSVisualEffectView alt sınıfı ile aşağıdakileri yapabilirsiniz: Bu başlı başına özel API'leri kullanmasa bile

- (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]; 
} 

, bu yüzden ne dönüyorlar beklediğiniz kullanmadığınızı kontrol edin ait olmayan katman hiyerarşileri içine kazmak başlar ve yok eğer değilse incelikle başarısız olur. Örneğin, 10.10 Yosemite'de, Backdrop katmanı, Görsel Efekt görünümünün doğrudan bir kararıydı, bu nedenle gelecekte değişiklikler olması muhtemel.

+0

Merhaba, cevabınız için teşekkürler, ancak maalesef bu şeffaflığı hiç ayarlamıyor gibi görünüyor. –

+0

Bu örnek, pencere bulanıklıkları içindi, böylece istediğiniz belirli katmanı elde etmek için katman hiyerarşisi etrafında kurcalamanız gerekebilir. UpdateLayer'da bir kesme noktası ayarlayın ve görsel efekt görünümünüzde aramanız gereken şeyi görmek için sürekli olarak po self.layer.sublayers'ı arayın. Elverişli olarak, çoğu katmanlar isimlendirilir, bu yüzden böyle az bir miktar delinebilirsin. Renk tonunu da kontrol eden "Tint" adında başka bir katman olduğuna inanıyorum. –