Làm cách nào để sử dụng UIVisualEffectView để làm mờ ảnh?


208

Ai đó có thể đưa ra một ví dụ nhỏ về việc áp dụng độ mờ cho hình ảnh? Tôi đã cố gắng tìm ra mã trong một thời gian rồi :( vẫn còn mới ở obj c!

Việc UIVisualEffectViewcung cấp một sự trừu tượng đơn giản trên các hiệu ứng hình ảnh phức tạp. Tùy thuộc vào hiệu ứng mong muốn, kết quả có thể ảnh hưởng đến nội dung được xếp lớp phía sau chế độ xem hoặc nội dung được thêm vào nội dung của chế độ xem.

Áp dụng a UIVisualEffectViewcho chế độ xem hiện tại để áp dụng hiệu ứng làm mờ hoặc rung cho chế độ xem thoát. Sau khi bạn thêm UIVisualEffectView vào cấu trúc phân cấp chế độ xem, hãy thêm bất kỳ bản xem trước nào vào nội dung Xem của UIVisualEffectView. Không thêm các cuộc phỏng vấn trực tiếp vào UIVisualEffectViewchính nó.

https://developer.apple.com/documentation/uikit/uivisualeffectview#//apple_Vf/occ/instp/UIVisualEffectView/contentView


1
Hãy cẩn thận để thêm quan điểm để UIVisualEffectView's contentView github.com/onmyway133/blog/issues/124
onmyway133

Ngoài ra, nếu bạn đang thêm nó vào một khung nhìn phụ và đặt khung của nó, đừng quên cập nhật khung hình trong viewDidLayoutSubview để đảm bảo xoay vòng hoạt động.
Steve Moser

Câu trả lời:


415

Chỉ cần đặt chế độ xem mờ này trên imageView. Đây là một ví dụ trong Mục tiêu-C:

UIVisualEffect *blurEffect;
blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];

UIVisualEffectView *visualEffectView;
visualEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];

visualEffectView.frame = imageView.bounds;
[imageView addSubview:visualEffectView];

và Swift:

var visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .Light))    

visualEffectView.frame = imageView.bounds

imageView.addSubview(visualEffectView)

3
cảm ơn bạn rất nhiều! Tôi đã quên cài đặt khung :( Không có gì trên google cho trực quan, vì vậy đây phải là cụm từ tìm kiếm đầu tiên :)
cNoob

1
Hy vọng tốt hơn API không thay đổi! Đó là một trong những lý do thảo luận về API Apple chưa được phát hành có thể rất khó. Ví dụ: một số API UIKit Dynamics thay đổi một chút giữa phiên bản beta và phát hành. Không có gì quan trọng, nhưng họ sẽ phá vỡ bất kỳ mã mẫu nào được viết dựa trên các API gốc.
Zev Eisenberg

5
Có cách nào để làm sống động mờ / vào?
Ruben Martinez Jr.

3
@BS Bạn có thể làm động các alpha của chế độ xem hiệu ứng hình ảnh. Bùng nổ.
Maciej Trybiło

2
UIBlurEffect thật tuyệt vời, nhưng lưu ý rằng nó không hoạt động trên các thiết bị cũ như iPad2 - Tôi đã mất hàng giờ để tìm hiểu lý do tại sao nó chỉ đặt một lớp mờ trên màn hình của tôi và không làm mờ - tất cả là do tôi đang thử nghiệm trên một thiết bị cũ hơn
Keith

135

Dưới đây là cách sử dụng UIVibrancyEffect và UIBlurEffect với UIVisualEffectView

Mục tiêu-C:

// Blur effect
UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
UIVisualEffectView *blurEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
[blurEffectView setFrame:self.view.bounds];
[self.view addSubview:blurEffectView];

// Vibrancy effect
UIVibrancyEffect *vibrancyEffect = [UIVibrancyEffect effectForBlurEffect:blurEffect];
UIVisualEffectView *vibrancyEffectView = [[UIVisualEffectView alloc] initWithEffect:vibrancyEffect];
[vibrancyEffectView setFrame:self.view.bounds];

// Label for vibrant text
UILabel *vibrantLabel = [[UILabel alloc] init];
[vibrantLabel setText:@"Vibrant"];
[vibrantLabel setFont:[UIFont systemFontOfSize:72.0f]];
[vibrantLabel sizeToFit];
[vibrantLabel setCenter: self.view.center];

// Add label to the vibrancy view
[[vibrancyEffectView contentView] addSubview:vibrantLabel];

// Add the vibrancy view to the blur view
[[blurEffectView contentView] addSubview:vibrancyEffectView];

Swift 4:

    // Blur Effect
    let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.dark)
    let blurEffectView = UIVisualEffectView(effect: blurEffect)
    blurEffectView.frame = view.bounds
    view.addSubview(blurEffectView)

    // Vibrancy Effect
    let vibrancyEffect = UIVibrancyEffect(blurEffect: blurEffect)
    let vibrancyEffectView = UIVisualEffectView(effect: vibrancyEffect)
    vibrancyEffectView.frame = view.bounds

    // Label for vibrant text
    let vibrantLabel = UILabel()
    vibrantLabel.text = "Vibrant"
    vibrantLabel.font = UIFont.systemFont(ofSize: 72.0)
    vibrantLabel.sizeToFit()
    vibrantLabel.center = view.center

    // Add label to the vibrancy view
    vibrancyEffectView.contentView.addSubview(vibrantLabel)

    // Add the vibrancy view to the blur view
    blurEffectView.contentView.addSubview(vibrancyEffectView)

1
Cách giải quyết hoạt động ngay cả khi không phân lớp, chỉ cần xác địnhextension UILabel { override func tintColorDidChange() { textColor = tintColor; super.tintColorDidChange() } }
Palimondo

1
Apple dường như đã sửa lỗi. Cách giải quyết của lớp con / tiện ích mở rộng không còn cần thiết trong iOS 8 beta 2.
Benjamin Mayo

2
Cảm ơn. Tôi đã kiểm tra và xác nhận sửa lỗi và chỉnh sửa câu trả lời.
Matt Rundle

1
Tôi đang cố gắng thêm điều này vào chế độ xem của mình nhưng mỗi khi tôi trình bày chế độ xem, nó sẽ bị mờ đi lặp lại cho đến khi tôi có được một nền trắng ... Tôi đang xóa chế độ xem với removeFromSuperView sau khi tôi loại bỏ nó nhưng tôi nhận được kết quả tương tự .. .. có ý kiến ​​gì không?
George Asda

@GeorgeAsda làm thế nào về thay vì gọi removeFromSuperView, bạn thực hiện [self.visualEffectView setHidden:NO];? Phân bổ và thêm vào chế độ xem là hoạt động đắt tiền hơn là ẩn hoặc hiển thị.
Yoon Lee

46

Bạn cũng có thể sử dụng trình xây dựng giao diện để tạo các hiệu ứng này một cách dễ dàng cho các tình huống đơn giản. Vì các giá trị z của các khung nhìn sẽ phụ thuộc vào thứ tự chúng được liệt kê trong Phác thảo tài liệu, bạn có thể kéo một UIVisualEffectViewphác thảo tài liệu trước khi xem bạn muốn làm mờ. Điều này tự động tạo ra một lồng nhau UIView, đó là thuộc contentViewtính của nhất định UIVisualEffectView. Nest những thứ trong chế độ xem này mà bạn muốn xuất hiện trên đầu mờ.

XCode6 beta5

Bạn cũng có thể dễ dàng tận dụng độ rung UIVisualEffect, nó sẽ tự động tạo một cái khác lồng UIVisualEffectViewtrong phác thảo tài liệu với độ rung được bật theo mặc định. Sau đó, bạn có thể thêm nhãn hoặc chế độ xem văn bản vào phần tử lồng nhau UIView(một lần nữa, thuộc contentViewtính của UIVisualEffectView), để đạt được hiệu ứng tương tự như phần tử UI "> trượt để mở khóa".

nhập mô tả hình ảnh ở đây


Bạn có thể xác nhận rằng những gì hiển thị thông qua thực sự bị mờ? Hình ảnh của tôi (cái mà bạn gọi là "BackgroundPhoto" trong hệ thống phân cấp của bạn) chỉ bị mờ đi dưới dạng Blur Style: Chế độ xem mờ tối. (Phiên bản phát hành của Xcode 6.01 và sử dụng Trình mô phỏng iOS)
tobinjim

Ý bạn là gì 'chỉ là mờ đi'? Bạn không nghĩ rằng nó bị mờ sau đó?
ohhh

Được rồi, tôi sẽ xem trong vài giờ nữa.
ohhh

Cảm ơn! Bạn có một hệ thống phân cấp chế độ xem trên BackgroundPhoto của bạn bị thu gọn trong các ảnh chụp màn hình ... Tôi chỉ sử dụng một UIImageView và gán một bức ảnh cho nó (một con chó màu sáng trên nền màu xanh lá cây - định nghĩa sắc nét giữa chân trắng và cỏ xanh là chỉ sắc nét khi được bao phủ bởi chế độ xem hiệu ứng hình ảnh như khi không).
tobinjim

1
Tôi đã thấy rằng việc thay đổi loại mờ thành Dark, nhãn có màu trắng ...
Daniel

8

Tôi thích tạo Hiệu ứng hình ảnh qua Storyboard - không có mã nào được sử dụng để tạo hoặc duy trì UI Elements. Nó cung cấp cho tôi hỗ trợ cảnh quan đầy đủ, quá. Tôi đã thực hiện một bản demo nhỏ về việc sử dụng UIVisualEffects với Blur và cả Vibrancy.

Bản demo trên Github


8

Nếu ai muốn câu trả lời trong Swift:

var blurEffect = UIBlurEffect(style: UIBlurEffectStyle.Dark) // Change .Dark into .Light if you'd like.

var blurView = UIVisualEffectView(effect: blurEffect)

blurView.frame = theImage.bounds // 'theImage' is an image. I think you can apply this to the view too!

Cập nhật:

Đến bây giờ, nó có sẵn theo IB để bạn không phải mã hóa bất cứ thứ gì cho nó :)


2
-(void) addBlurEffectOverImageView:(UIImageView *) _imageView
{
    UIVisualEffect *blurEffect;
    blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];

    UIVisualEffectView *visualEffectView;
    visualEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];

    visualEffectView.frame = _imageView.bounds;
    [_imageView addSubview:visualEffectView];
}

Thêm một số văn bản với câu trả lời cho cách câu trả lời của bạn giúp OP khắc phục sự cố được đăng
ρяσѕρєя K

0

Điều này được sử dụng để làm mờ nền, sáng hoặc tối, để văn bản có thể được phủ dễ dàng hơn. Bạn có thể tùy chọn kích hoạt tính sinh động, khiến văn bản được hiển thị ở màu sáng, tương phản cùng với độ mờ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.