วิธีการใช้ UIVisualEffectView เพื่อ Blur Image


208

ใครช่วยยกตัวอย่างการเบลอภาพให้บ้าง ฉันพยายามหารหัสมาพักหนึ่งแล้ว :( ยังใหม่อยู่ที่ obj c!

UIVisualEffectViewให้นามธรรมง่ายกว่าผลภาพที่ซับซ้อน ผลลัพธ์อาจส่งผลต่อเนื้อหาที่อยู่ด้านหลังมุมมองหรือเนื้อหาที่เพิ่มใน contentView ของมุมมอง

นำUIVisualEffectViewไปใช้กับมุมมองที่มีอยู่เพื่อใช้เอฟเฟกต์เบลอหรือความสั่นไหวให้กับมุมมองที่ออก หลังจากที่คุณเพิ่ม UIVisualEffectView เพื่อลำดับชั้นดูเพิ่ม subviews ใด ๆ ที่จะ contentView UIVisualEffectViewของ อย่าเพิ่มหัวข้อย่อยโดยตรงกับUIVisualEffectViewตัวเอง

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


1
ระวังการเพิ่มมุมมองในUIVisualEffectView's contentView github.com/onmyway133/blog/issues/124
onmyway133

นอกจากนี้หากคุณเพิ่มลงในมุมมองย่อยและการตั้งค่ากรอบอย่าลืมอัปเดตเฟรมใน viewDidLayoutSubviews เพื่อให้แน่ใจว่าการหมุนใช้งานได้
Steve Moser

คำตอบ:


415

เพียงแค่ใส่มุมมองเบลอนี้บน imageView นี่คือตัวอย่างใน Objective-C:

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

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

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

และรวดเร็ว:

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

visualEffectView.frame = imageView.bounds

imageView.addSubview(visualEffectView)

3
ขอบคุณมาก! ฉันลืมเกี่ยวกับการตั้งค่าเฟรม :( ยังไม่มีอะไรใน google สำหรับการมองเห็นดังนั้นนี่ควรเป็นข้อความค้นหาแรก :)
cNoob

1
หวังว่า API จะไม่เปลี่ยนแปลง! นั่นเป็นหนึ่งในเหตุผลที่พูดคุยเกี่ยวกับ Apple API ที่ยังไม่เปิดตัวอาจเป็นเรื่องยุ่งยาก ตัวอย่างเช่น UIKit Dynamics API บางตัวเปลี่ยนไปเล็กน้อยระหว่างเบต้าและรีลีส ไม่มีอะไรที่สำคัญ แต่พวกเขาจะหักรหัสตัวอย่างใด ๆ ที่เขียนกับ API ดั้งเดิม
Zev Eisenberg

5
อย่างไรก็ตามมีการเคลื่อนไหวเบลอเข้า / ออก?
Ruben Martinez Jr.

3
@BS คุณสามารถเคลื่อนไหวอัลฟาของมุมมองเอฟเฟ็กต์ภาพ ความเจริญ
Maciej Trybiło

2
UIBlurEffect นั้นยอดเยี่ยม แต่โปรดทราบว่ามันไม่ได้ทำงานบนอุปกรณ์รุ่นเก่าอย่าง iPad2 - ฉันใช้เวลาหลายชั่วโมงในการคิดว่าทำไมมันถึงวางเลเยอร์โปร่งแสงไว้บนหน้าจอและไม่เบลอ - มันเป็นเพราะฉันทดสอบอุปกรณ์รุ่นเก่า
Keith

135

นี่คือวิธีใช้ UIVibrancyEffect และ UIBlurEffect กับ UIVisualEffectView

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

สวิฟท์ 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
วิธีแก้ปัญหาทำงานได้โดยไม่ต้อง subclassing เพียงกำหนดextension UILabel { override func tintColorDidChange() { textColor = tintColor; super.tintColorDidChange() } }
Palimondo

1
Apple ดูเหมือนจะแก้ไขข้อผิดพลาดแล้ว วิธีแก้ปัญหาคลาสย่อย / ส่วนขยายไม่จำเป็นใน iOS 8 เบต้า 2 อีกต่อไป
Benjamin Mayo

2
ขอบคุณ ฉันได้ทดสอบและยืนยันการแก้ไขข้อบกพร่องและแก้ไขคำตอบแล้ว
Matt Rundle

1
ฉันพยายามที่จะเพิ่มสิ่งนี้ลงในมุมมองของฉัน แต่ทุกครั้งที่ฉันนำเสนอมุมมองมันจะเบลอซ้ำแล้วซ้ำอีกจนกว่าฉันจะมีพื้นหลังสีขาว ... ฉันกำลังลบมุมมองด้วย removeFromSuperView หลังจากฉันเลิกมัน .. ความคิดใด ๆ
George Asda

@GorgeorgeAda วิธีการเกี่ยวกับแทนที่จะโทรremoveFromSuperViewคุณทำ[self.visualEffectView setHidden:NO];? การจัดสรรและเพิ่มลงในมุมมองนั้นเป็นการดำเนินการที่แพงกว่าการซ่อนหรือแสดงผล
Yoon Lee

46

คุณยังสามารถใช้ตัวสร้างส่วนต่อประสานเพื่อสร้างเอฟเฟกต์เหล่านี้ได้อย่างง่ายดายสำหรับสถานการณ์ที่เรียบง่าย เนื่องจากค่า z ของมุมมองจะขึ้นอยู่กับลำดับที่แสดงใน Document Outline คุณสามารถลาก a UIVisualEffectViewลงบนเค้าร่างเอกสารก่อนมุมมองที่คุณต้องการเบลอ นี้จะสร้างซ้อนกันUIViewซึ่งเป็นทรัพย์สินของที่กำหนดcontentView UIVisualEffectViewทำสิ่งต่าง ๆ ในมุมมองนี้ที่คุณต้องการให้ปรากฏบนเบลอ

XCode6 beta5

นอกจากนี้คุณยังสามารถใช้ประโยชน์จากความสั่นสะเทือนUIVisualEffectซึ่งจะสร้างซ้อนกันโดยอัตโนมัติUIVisualEffectViewในโครงร่างเอกสารที่มีการเปิดใช้งานความสั่นสะเทือนตามค่าเริ่มต้น จากนั้นคุณสามารถเพิ่มป้ายกำกับหรือมุมมองข้อความให้กับองค์ประกอบซ้อนUIView(อีกครั้งcontentViewคุณสมบัติของUIVisualEffectView) เพื่อให้ได้ผลเช่นเดียวกับองค์ประกอบ UI "เลื่อนเพื่อปลดล็อค"

ป้อนคำอธิบายรูปภาพที่นี่


คุณสามารถยืนยันได้ว่าสิ่งที่แสดงให้เห็นนั้นเบลอจริงหรือไม่ ภาพของฉัน (สิ่งที่คุณเรียกว่า "BackgroundPhoto" ในลำดับชั้นของคุณ) จางลงภายใต้สไตล์ Blur: มุมมองโปร่งแสงมืด (Xcode 6.01 เวอร์ชั่นวางจำหน่ายและใช้งาน iOS Simulator)
tobinjim

คุณหมายถึง 'เพิ่งจาง' คุณไม่คิดว่ามันเบลองั้นเหรอ?
ohhh

โอเคฉันจะดูในอีกไม่กี่ชั่วโมง
ohhh

ขอบคุณ! คุณมีลำดับชั้นการดูบน BackgroundPhoto ของคุณที่ถูกยุบในภาพหน้าจอ ... ฉันเพิ่งใช้ UIImageView และกำหนดภาพถ่ายให้กับมัน (สุนัขสีอ่อนกับพื้นหลังสีเขียว - ความคมชัดที่ชัดเจนระหว่างขาสีขาวและหญ้าสีเขียวคือ คมชัดเท่าเมื่อถูกปกคลุมด้วยมุมมองเอฟเฟ็กต์ภาพเหมือนเมื่อไม่)
tobinjim

1
ฉันเคยเห็นว่าการเปลี่ยนประเภทของความพร่ามัวเป็นความมืดฉลากจะเปลี่ยนเป็นสีขาว ...
Daniel

8

ฉันชอบสร้างเอฟเฟ็กต์ภาพผ่านสตอรีบอร์ด - ไม่ใช้รหัสในการสร้างหรือบำรุงรักษาองค์ประกอบ UI มันให้การสนับสนุนแนวนอนแบบเต็มเช่นกัน ฉันได้สาธิตการใช้ UIVisualEffects กับ Blur และ Vibrancy

การสาธิตเกี่ยวกับ Github


8

หากใครต้องการคำตอบใน 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!

อัปเดต:

ณ ตอนนี้มีให้บริการภายใต้ IB ดังนั้นคุณจึงไม่ต้องเขียนโค้ดอะไรเลย :)


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

เพิ่มข้อความพร้อมคำตอบสำหรับวิธีที่คำตอบของคุณช่วย OP ในการแก้ไขปัญหาที่โพสต์
Kяσѕρєя K

0

สิ่งนี้ใช้เพื่อทำให้ฉากหลังเบลอไม่ว่าจะสว่างหรือมืดเพื่อให้สามารถวางข้อความได้ง่ายขึ้น คุณสามารถเลือกเปิดใช้งานการสั่นสะเทือนซึ่งเป็นสาเหตุให้ข้อความแสดงผลในสีที่สว่างและตัดกันพร้อมกับความพร่ามัว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.