2016-05-14 19 views
5

Có thể điều chỉnh bán kính mờ và độ trong suốt của NSVisualEffectView khi nó được áp dụng cho NSWindow (Swift hoặc Objective-C) không? Tôi đã thử tất cả các biến thể của NSVisualEffectMaterial (tối, trung bình, ánh sáng) - nhưng điều đó không cắt nó. Trong hình bên dưới, tôi đã sử dụng API không công khai của Apple với CGSSetWindowBackgroundBlurRadius ở bên trái và NSVisualEffectView ở bên phải.Điều chỉnh bán kính mờ NSVisualEffectView và độ trong suốt

enter image description here

Tôi đang cố gắng để đạt được cái nhìn về những gì ở bên trái, nhưng có vẻ như tôi xuống hạng để sử dụng các phương pháp bên phải.

Dưới đây là mã của tôi:

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

Có thể, liên quan - nhưng không trả lời câu hỏi của tôi:

Trả lời

2

Mặc dù tôi không muốn giới thiệu này trừ khi bạn đã sẵn sàng để quay trở lại nó không hoạt động trong một bản phát hành trong tương lai, bạn có thể phân lớp NSVisualEffectView với những điều sau đây để làm những gì bạn muốn:

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

Mặc dù điều này không sử dụng các API cá nhân cho mỗi gia nhập, nó bắt đầu thâm nhập vào hệ thống phân cấp lớp mà bạn không sở hữu, vì vậy hãy chắc chắn để kiểm tra xem những gì bạn đang nhận được lại là những gì bạn mong đợi tăng gấp đôi, và thất bại nếu không. Ví dụ, trên 10,10 Yosemite, lớp Backdrop là một phần tử trực tiếp của chế độ xem Hiệu ứng Trực quan, vì vậy mọi thứ có thể sẽ thay đổi trong tương lai.

+0

Xin chào, cảm ơn câu trả lời nhưng tiếc là điều này dường như không điều chỉnh độ trong suốt. –

+0

Ví dụ này là dành cho trong cửa sổ làm mờ, vì vậy bạn có thể cần phải poke xung quanh các hệ thống phân cấp lớp để có được lớp cụ thể mà bạn muốn. Đặt một điểm ngắt trong 'updateLayer' và liên tục gọi' po self.layer.sublayers' để xem những gì bạn cần tìm kiếm trong chế độ xem hiệu ứng hình ảnh của bạn. Thuận tiện, hầu hết các lớp được đặt tên, vì vậy bạn có thể đi sâu vào từng chút một như thế. Tôi tin rằng có một lớp khác gọi là 'Tint' điều khiển tông màu. –

Các vấn đề liên quan