Membuat tampilan hamparan buram

Jawaban:

552

Anda dapat menggunakan UIVisualEffectViewuntuk mencapai efek ini. Ini adalah API asli yang telah disesuaikan untuk kinerja dan masa pakai baterai yang hebat, plus mudah diimplementasikan.

Cepat:

//only apply the blur if the user hasn't disabled transparency effects
if !UIAccessibility.isReduceTransparencyEnabled {
    view.backgroundColor = .clear

    let blurEffect = UIBlurEffect(style: .dark)
    let blurEffectView = UIVisualEffectView(effect: blurEffect)
    //always fill the view
    blurEffectView.frame = self.view.bounds
    blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]

    view.addSubview(blurEffectView) //if you have more UIViews, use an insertSubview API to place it where needed
} else {
    view.backgroundColor = .black
}

Tujuan-C:

//only apply the blur if the user hasn't disabled transparency effects
if (!UIAccessibilityIsReduceTransparencyEnabled()) {
    self.view.backgroundColor = [UIColor clearColor];

    UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
    UIVisualEffectView *blurEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
    //always fill the view
    blurEffectView.frame = self.view.bounds;
    blurEffectView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

    [self.view addSubview:blurEffectView]; //if you have more UIViews, use an insertSubview API to place it where needed
} else {
    self.view.backgroundColor = [UIColor blackColor];
}

Jika Anda menghadirkan pengontrol tampilan ini secara digital untuk mengaburkan konten yang mendasarinya, Anda harus mengatur gaya presentasi modal menjadi Over Current Context dan mengatur warna latar belakang untuk menghapus untuk memastikan pengontrol tampilan yang mendasarinya akan tetap terlihat setelah ini ditampilkan di atas.

Jordan H
sumber
7
Sebagai klarifikasi atas insertSubView:belowSubView:komentar dalam kode ini, saya telah menggunakan yang berikut untuk mengatur blur sebagai latar belakang tampilan:view.insertSubview(blurEffectView, atIndex: 0)
Michael Voccola
2
Dengan mengacu pada jawaban di atas, apakah perlu untuk memeriksa "jika (! UIAccessibilityIsReduceTransparencyEnabled ())" atau Bisakah kita lewati itu?
GKK
3
Jika Anda menampilkan pengontrol tampilan Anda, pastikan Anda mengubah modalPresentationStyle = .overCurrentContext bersama dengan pengaturan warna latar belakang sejelas
Shardul
3
Bekerja Luar Biasa !!! Perlu perubahan tunggal: [self.view insertSubview: blurEffectView atIndex: 1];
Abhishek Thapliyal
2
Di iOS 11, saya merasa tidak perlu untuk memeriksa secara manual UIAccessibilityIsReduceTransparencyEnabled().
Nate Whittaker
284

Gambar Inti

Karena gambar dalam tangkapan layar itu statis, Anda dapat menggunakan CIGaussianBlurdari Core Image (memerlukan iOS 6). Berikut ini contohnya: https://github.com/evanwdavis/Fun-with-Masks/blob/master/Fun%20with%20Masks/EWDBlurExampleVC.m

Pikiran Anda, ini lebih lambat daripada opsi lain di halaman ini.

#import <QuartzCore/QuartzCore.h>

- (UIImage*) blur:(UIImage*)theImage
{   
    // ***********If you need re-orienting (e.g. trying to blur a photo taken from the device camera front facing camera in portrait mode)
    // theImage = [self reOrientIfNeeded:theImage];

    // create our blurred image
    CIContext *context = [CIContext contextWithOptions:nil];
    CIImage *inputImage = [CIImage imageWithCGImage:theImage.CGImage];

    // setting up Gaussian Blur (we could use one of many filters offered by Core Image)
    CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"];
    [filter setValue:inputImage forKey:kCIInputImageKey];
    [filter setValue:[NSNumber numberWithFloat:15.0f] forKey:@"inputRadius"];
    CIImage *result = [filter valueForKey:kCIOutputImageKey];

    // CIGaussianBlur has a tendency to shrink the image a little, 
    // this ensures it matches up exactly to the bounds of our original image
    CGImageRef cgImage = [context createCGImage:result fromRect:[inputImage extent]];

    UIImage *returnImage = [UIImage imageWithCGImage:cgImage];//create a UIImage for this function to "return" so that ARC can manage the memory of the blur... ARC can't manage CGImageRefs so we need to release it before this function "returns" and ends.
    CGImageRelease(cgImage);//release CGImageRef because ARC doesn't manage this on its own.

    return returnImage;

    // *************** if you need scaling
    // return [[self class] scaleIfNeeded:cgImage];
}

+(UIImage*) scaleIfNeeded:(CGImageRef)cgimg {
    bool isRetina = [[[UIDevice currentDevice] systemVersion] intValue] >= 4 && [[UIScreen mainScreen] scale] == 2.0;
    if (isRetina) {
        return [UIImage imageWithCGImage:cgimg scale:2.0 orientation:UIImageOrientationUp];
    } else {
        return [UIImage imageWithCGImage:cgimg];
    }
}

- (UIImage*) reOrientIfNeeded:(UIImage*)theImage{

    if (theImage.imageOrientation != UIImageOrientationUp) {

        CGAffineTransform reOrient = CGAffineTransformIdentity;
        switch (theImage.imageOrientation) {
            case UIImageOrientationDown:
            case UIImageOrientationDownMirrored:
                reOrient = CGAffineTransformTranslate(reOrient, theImage.size.width, theImage.size.height);
                reOrient = CGAffineTransformRotate(reOrient, M_PI);
                break;
            case UIImageOrientationLeft:
            case UIImageOrientationLeftMirrored:
                reOrient = CGAffineTransformTranslate(reOrient, theImage.size.width, 0);
                reOrient = CGAffineTransformRotate(reOrient, M_PI_2);
                break;
            case UIImageOrientationRight:
            case UIImageOrientationRightMirrored:
                reOrient = CGAffineTransformTranslate(reOrient, 0, theImage.size.height);
                reOrient = CGAffineTransformRotate(reOrient, -M_PI_2);
                break;
            case UIImageOrientationUp:
            case UIImageOrientationUpMirrored:
                break;
        }

        switch (theImage.imageOrientation) {
            case UIImageOrientationUpMirrored:
            case UIImageOrientationDownMirrored:
                reOrient = CGAffineTransformTranslate(reOrient, theImage.size.width, 0);
                reOrient = CGAffineTransformScale(reOrient, -1, 1);
                break;
            case UIImageOrientationLeftMirrored:
            case UIImageOrientationRightMirrored:
                reOrient = CGAffineTransformTranslate(reOrient, theImage.size.height, 0);
                reOrient = CGAffineTransformScale(reOrient, -1, 1);
                break;
            case UIImageOrientationUp:
            case UIImageOrientationDown:
            case UIImageOrientationLeft:
            case UIImageOrientationRight:
                break;
        }

        CGContextRef myContext = CGBitmapContextCreate(NULL, theImage.size.width, theImage.size.height, CGImageGetBitsPerComponent(theImage.CGImage), 0, CGImageGetColorSpace(theImage.CGImage), CGImageGetBitmapInfo(theImage.CGImage));

        CGContextConcatCTM(myContext, reOrient);

        switch (theImage.imageOrientation) {
            case UIImageOrientationLeft:
            case UIImageOrientationLeftMirrored:
            case UIImageOrientationRight:
            case UIImageOrientationRightMirrored:
                CGContextDrawImage(myContext, CGRectMake(0,0,theImage.size.height,theImage.size.width), theImage.CGImage);
                break;

            default:
                CGContextDrawImage(myContext, CGRectMake(0,0,theImage.size.width,theImage.size.height), theImage.CGImage);
                break;
        }

        CGImageRef CGImg = CGBitmapContextCreateImage(myContext);
        theImage = [UIImage imageWithCGImage:CGImg];

        CGImageRelease(CGImg);
        CGContextRelease(myContext);
    }

    return theImage;
}

Stack blur (Kotak + Gaussian)

  • StackBlur Ini mengimplementasikan campuran Box dan Gaussian blur. 7x lebih cepat dari gaussian non akselerasi, tetapi tidak seburuk kotak blur. Lihat demo di sini (versi plugin Java) atau di sini (versi JavaScript). Algoritma ini digunakan di KDE dan Camera + dan lainnya. Itu tidak menggunakan Kerangka Percepatan tetapi cepat.

Mempercepat Kerangka

  • Dalam sesi "Implementing Engaging UI di iOS" dari WWDC 2013 Apple menjelaskan cara membuat latar belakang kabur (pukul 14:30), dan menyebutkan metode yang applyLightEffectditerapkan dalam kode sampel menggunakan Accelerate.framework.

  • GPUImage menggunakan shader OpenGL untuk membuat buram dinamis. Ini memiliki beberapa jenis blur: GPUImageBoxBlurFilter, GPUImageFastBlurFilter, GaussianSelectiveBlur, GPUImageGaussianBlurFilter. Bahkan ada GPUImageiOSBlurFilter yang "harus sepenuhnya meniru efek blur yang disediakan oleh panel kontrol iOS 7" ( tweet , artikel ). Artikel ini terperinci dan informatif.

    - (UIImage *) blurryGPUImage: (UIImage *) image denganBlurLevel: (NSInteger) blur {
        GPUImageFastBlurFilter * blurFilter = [GPUImageFastBlurFilter baru];
        blurFilter.blurSize = blur;
        UIImage * result = [blurFilter imageByFilteringImage: image];
        hasil pengembalian;
    }

Barang lainnya

Andy Matuschak mengatakan di Twitter: "Anda tahu, banyak tempat di mana kita melakukannya secara real time, statis dengan trik-trik pintar."

Di doubleencore.com mereka mengatakan "kami telah menemukan bahwa radius 10 pt blur ditambah peningkatan 10 pt pada saturasi terbaik meniru efek blur iOS 7 dalam sebagian besar keadaan".

Mengintip header pribadi SBFProceduralWallpaperView Apple .

Akhirnya, ini bukan blur nyata, tapi ingat Anda dapat mengatur rasterizationScale untuk mendapatkan gambar pixelated: http://www.dimzzy.com/blog/2010/11/blur-effect-for-uiview/

Jano
sumber
Terima kasih atas jawabannya! Satu masalah terpecahkan. Tapi kita punya satu masalah lagi. Bagaimana cara mendapatkan gambar sampul di iOS 7. Jika memungkinkan?
kondratyevdev
Jika maksud Anda cara mendapatkan gambar wallpaper latar belakang dari ponsel Anda, tidak tahu pada titik ini. Saya tidak melihat fungsionalitas di API diffs . Mungkin menggunakan API pribadi.
Jano
Satu hal yang saya perhatikan (dan saya bisa benar-benar salah) adalah bahwa kekaburan Apple tampaknya menambahkan sedikit saturasi warna juga. Jadi, saya tidak berpikir itu blur gaussian sederhana.
xtravar
Ingat faktor skala ketika mengembalikan yang UIImagesebaliknya itu akan terlihat terlalu besar pada perangkat Retina ...
Stephen Darlington
Apakah Anda tahu jika efek tersebut dapat diterapkan ke UITableViewCell tanpa menurunkan kinerja?
Leonardo
15

Saya memutuskan untuk mengirim versi Objective-C tertulis dari jawaban yang diterima hanya untuk memberikan lebih banyak opsi dalam pertanyaan ini ..

- (UIView *)applyBlurToView:(UIView *)view withEffectStyle:(UIBlurEffectStyle)style andConstraints:(BOOL)addConstraints
{
  //only apply the blur if the user hasn't disabled transparency effects
  if(!UIAccessibilityIsReduceTransparencyEnabled())
  {
    UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:style];
    UIVisualEffectView *blurEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
    blurEffectView.frame = view.bounds;

    [view addSubview:blurEffectView];

    if(addConstraints)
    {
      //add auto layout constraints so that the blur fills the screen upon rotating device
      [blurEffectView setTranslatesAutoresizingMaskIntoConstraints:NO];

      [view addConstraint:[NSLayoutConstraint constraintWithItem:blurEffectView
                                                       attribute:NSLayoutAttributeTop
                                                       relatedBy:NSLayoutRelationEqual
                                                          toItem:view
                                                       attribute:NSLayoutAttributeTop
                                                      multiplier:1
                                                        constant:0]];

      [view addConstraint:[NSLayoutConstraint constraintWithItem:blurEffectView
                                                       attribute:NSLayoutAttributeBottom
                                                       relatedBy:NSLayoutRelationEqual
                                                          toItem:view
                                                       attribute:NSLayoutAttributeBottom
                                                      multiplier:1
                                                        constant:0]];

      [view addConstraint:[NSLayoutConstraint constraintWithItem:blurEffectView
                                                       attribute:NSLayoutAttributeLeading
                                                       relatedBy:NSLayoutRelationEqual
                                                          toItem:view
                                                       attribute:NSLayoutAttributeLeading
                                                      multiplier:1
                                                        constant:0]];

      [view addConstraint:[NSLayoutConstraint constraintWithItem:blurEffectView
                                                       attribute:NSLayoutAttributeTrailing
                                                       relatedBy:NSLayoutRelationEqual
                                                          toItem:view
                                                       attribute:NSLayoutAttributeTrailing
                                                      multiplier:1
                                                        constant:0]];
    }
  }
  else
  {
    view.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.7];
  }

  return view;
}

Kendala bisa dihapus jika Anda ingin memetikan jika Anda hanya mendukung mode potret atau saya hanya menambahkan bendera ke fungsi ini untuk menggunakannya atau tidak ..

valbu17
sumber
1
untuk orang baru (saya), salah satu cara untuk memanggil metode di atas adalah: [self applyBlurToView: self.view withEffectStyle: UIBlurEffectStyleDark andConstraints: YES]; (terima kasih NorthBlast)
tmr
14

Saya tidak berpikir saya diperbolehkan memposting kode, tetapi posting di atas yang menyebutkan kode sampel WWDC sudah benar. Ini tautannya: https://developer.apple.com/downloads/index.action?name=WWDC%202013

File yang Anda cari adalah kategori pada UIImage, dan metode ini adalah applyLightEffect.

Seperti yang saya catat di atas dalam komentar, Apple Blur memiliki saturasi dan hal-hal lain yang terjadi selain blur. Pengaburan yang sederhana tidak akan berhasil ... jika Anda ingin meniru gaya mereka.

xtravar
sumber
8
Tautan itu rusak. Berikut tautan yang benar: developer.apple.com/downloads/index.action?name=WWDC%202013
olivaresF
Perhatikan bahwa kode contoh ini memerlukan XCode 5.0 dan iOS SDK 7.0 (yang belum dirilis secara publik)
Mike Gledhill
Terima kasih atas tautan pasti, namun ada beberapa kode contoh di dalamnya, yang mana berisi kategori UIImage yang relevan?
Leonardo
1
@Leonardo iOS_RunningWithASnap.zip
John Starr Dewar
1
... atau iOS_UIImageEffects.zip lebih khusus hanya ini.
John Starr Dewar
9

Saya pikir solusi termudah untuk ini adalah dengan menimpa UIToolbar, yang mengaburkan segalanya di belakangnya di iOS 7. Ini cukup licik, tetapi sangat mudah bagi Anda untuk menerapkannya, dan cepat!

Anda dapat melakukannya dengan tampilan apa pun, cukup buat subkelas UIToolbaralih-alih UIView. Anda bahkan dapat melakukannya dengan UIViewController's viewproperti, misalnya ...

1) buat kelas baru yang merupakan "Subkelas" UIViewControllerdan centang kotak "Dengan XIB untuk antarmuka pengguna".

2) Pilih View dan pergi ke inspektur identitas di panel sebelah kanan (alt-command-3). Ubah "Kelas" menjadi UIToolbar. Sekarang pergi ke inspektur atribut (alt-command-4) dan ubah warna "Background" menjadi "Clear Color".

3) Tambahkan subview ke tampilan utama dan hubungkan ke IBOutlet di antarmuka Anda. Sebut saja backgroundColorView. Akan terlihat seperti ini, sebagai kategori pribadi dalam file implementasi ( .m).

@interface BlurExampleViewController ()
@property (weak, nonatomic) IBOutlet UIView *backgroundColorView;
@end

4) Buka file view controller implementation ( .m) dan ubah -viewDidLoadmetodenya, menjadi seperti berikut:

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.barStyle = UIBarStyleBlack; // this will give a black blur as in the original post
    self.backgroundColorView.opaque = NO;
    self.backgroundColorView.alpha = 0.5;
    self.backgroundColorView.backgroundColor = [UIColor colorWithWhite:0.3 alpha:1];
}

Ini akan memberi Anda tampilan abu-abu gelap, yang mengaburkan segalanya di belakangnya. Tidak ada bisnis yang lucu, tidak ada gambar inti yang lambat yang kabur, menggunakan semua yang ada di ujung jari Anda yang disediakan oleh OS / SDK.

Anda dapat menambahkan tampilan pengontrol tampilan ini ke tampilan lain, sebagai berikut:

[self addChildViewController:self.blurViewController];
[self.view addSubview:self.blurViewController.view];
[self.blurViewController didMoveToParentViewController:self];

// animate the self.blurViewController into view

Beri tahu saya jika ada yang tidak jelas, saya akan dengan senang hati membantu!


Edit

UIToolbar telah diubah di 7.0.3 untuk memberikan efek yang mungkin tidak diinginkan saat menggunakan blur berwarna.

Kami dulu dapat mengatur warna menggunakan barTintColor, tetapi jika Anda melakukan ini sebelumnya, Anda perlu mengatur komponen alfa menjadi kurang dari 1. Jika tidak, UIToolbar Anda akan menjadi warna yang benar-benar buram - tanpa blur.

Ini dapat dicapai sebagai berikut: (mengingat selfadalah subkelas dari UIToolbar)

UIColor *color = [UIColor blueColor]; // for example
self.barTintColor = [color colorWithAlphaComponent:0.5];

Ini akan memberi warna biru pada tampilan kabur.

Sam
sumber
1
Bukan orang jahat. Saya menggunakan tiga baris ini dalam pandangan saya: self.backgroundColorView.opaque = NO; self.backgroundColorView.alpha = 0.5; self.backgroundColorView.backgroundColor = [UIColor colorWithWhite:0.3 alpha:1];Tapi latar belakangnya tidak kabur, cukup buat efek yang bagus. Bagaimanapun, terima kasih!
IgniteCoders
1
Saya tidak melihat adanya kabur sama sekali menggunakan teknik ini. Itu hanya membuat overlay berwarna.
MusiGenesis
pastikan alpha overlay berwarna kurang dari 1. Anda dapat menggunakan UIToolbar tanpa pengontrol tampilan, yang mungkin lebih sederhana tergantung pada apa yang Anda butuhkan.
Sam
Pria trik yang rapi. Saya mengubah pandangan saya ke kelas UIToolbar di storyboard, lalu mengubah latar belakang tampilan menjadi warna yang jelas. Itu memberi latar belakang buram putih. Jika Anda membuat alpha kurang dari 1 efek buram akan hilang.
Badr
9

Berikut ini adalah implementasi cepat di Swift menggunakan CIGaussianBlur:

func blur(image image: UIImage) -> UIImage {
    let radius: CGFloat = 20;
    let context = CIContext(options: nil);
    let inputImage = CIImage(CGImage: image.CGImage!);
    let filter = CIFilter(name: "CIGaussianBlur");
    filter?.setValue(inputImage, forKey: kCIInputImageKey);
    filter?.setValue("\(radius)", forKey:kCIInputRadiusKey);
    let result = filter?.valueForKey(kCIOutputImageKey) as! CIImage;
    let rect = CGRectMake(radius * 2, radius * 2, image.size.width - radius * 4, image.size.height - radius * 4)
    let cgImage = context.createCGImage(result, fromRect: rect);
    let returnImage = UIImage(CGImage: cgImage);

    return returnImage;
}
kev
sumber
7

Skala blur khusus

Anda dapat mencoba UIVisualEffectView dengan pengaturan khusus sebagai -

class BlurViewController: UIViewController {
    private let blurEffect = (NSClassFromString("_UICustomBlurEffect") as! UIBlurEffect.Type).init()

    override func viewDidLoad() {
        super.viewDidLoad()
        let blurView = UIVisualEffectView(frame: UIScreen.main.bounds)
        blurEffect.setValue(1, forKeyPath: "blurRadius")
        blurView.effect = blurEffect
        view.addSubview(blurView)
    }   
}

Output: - untuk blurEffect.setValue(1...& blurEffect.setValue(2.. masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Mendongkrak
sumber
3
Ini akan berhenti berfungsi jika dalam versi iOS berikutnya parameter ini diubah.
Ariel Bogdziewicz
@ArielBogdziewicz saat ini berfungsi. saya akan memperbarui jika ada variasi API di wwdc.
Jack
Ummm ... tidak, Anda tidak ingin mengakses API pribadi. Mereka pribadi karena suatu alasan. Mereka akan berubah, mereka akan rusak, dan / atau Apple akan menolak aplikasi Anda. Gunakan metode lain, ada banyak. Kudos untuk menemukan hack, tetapi, tidak disarankan.
n13
@ Jack Terima kasih banyak atas jawaban ini! Ini satu-satunya solusi yang saya temukan untuk masalah saya: mengaburkan tampilan sesuai dengan posisi pandangan lain. Namun, saya masih memiliki pertanyaan lain. Apakah ada cara saya bisa menambahkan semangat di atas UIBlurEffect saya? Jika ya, bagaimana caranya? Apakah saya perlu membuat tampilan lain untuk ini di atas blurView saya? Saya sudah mencoba tetapi selalu macet ketika saya menggunakan. (NSClassFromString("_UICustomVibrancyEffect") as! UIVibrancyEffect.Type).init()Sangat menghargai bantuan!
Moritz
@Moritz belum mencoba. Tetapi itu harus berhasil. Anda dapat mencoba & memeriksa.
Jack
7

Berikut cara mudah untuk menambahkan blur khusus tanpa tawar-menawar dengan API pribadi menggunakan UIViewPropertyAnimator :

Pertama, deklarasikan properti kelas:

var blurAnimator: UIViewPropertyAnimator!

Kemudian atur tampilan blur Anda di viewDidLoad():

let blurEffectView = UIVisualEffectView()
blurEffectView.backgroundColor = .clear
blurEffectView.frame = view.bounds
blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
view.addSubview(blurEffectView)

blurAnimator = UIViewPropertyAnimator(duration: 1, curve: .linear) { [blurEffectView] in
    blurEffectView.effect = UIBlurEffect(style: .light)
}

blurAnimator.fractionComplete = 0.15 // set the blur intensity.    

Catatan: Solusi ini tidak cocok untuk UICollectionView/ UITableViewsel

Adam Bardon
sumber
1
Ini adalah satu-satunya solusi, yang saya temukan, jika Anda ingin mengontrol transparansi UIVisualEffectView.
Denis Kutlubaev
6

masukkan deskripsi gambar di sini

Dari Xcode Anda dapat melakukannya dengan mudah. Ikuti langkah-langkah dari xcode. Drage tampilan efek visual pada tampilan tampilan atau gambar Anda.

Selamat Coding :)

Mehedi Hasan
sumber
5

Jawaban yang diterima benar tetapi ada langkah penting yang hilang di sini, jika pandangan ini - yang Anda inginkan latar belakangnya kabur - disajikan menggunakan

[self presentViewController:vc animated:YES completion:nil]

Secara default, ini akan meniadakan blur karena UIKit menghapus tampilan presenter, yang sebenarnya Anda kabur. Untuk menghindari penghapusan itu, tambahkan baris ini sebelum yang sebelumnya

vc.modalPresentationStyle = UIModalPresentationOverFullScreen;

Atau gunakan Overgaya lain .

Aleksandar Vacić
sumber
3

TUJUAN-C

UIVisualEffect *blurEffect;
blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
UIVisualEffectView *visualEffectView;
visualEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
visualEffectView.frame = self.accessImageView.bounds;
[self.accessImageView addSubview:visualEffectView];

SWIFT 3.0

let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.dark)
let blurEffectView = UIVisualEffectView(effect: blurEffect)
blurEffectView.frame = view.bounds
blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
view.addSubview(blurEffectView)

dari: https://stackoverflow.com/a/24083728/4020910

BennyTheNerd
sumber
2

Menggunakan UIImageEffects

Untuk orang-orang yang ingin lebih banyak kontrol, Anda dapat menggunakan UIImageEffectskode sampel Apple .

Anda dapat menyalin kode UIImageEffectsdari Perpustakaan Pengembang Apple: Memburamkan dan Mewarnai Gambar

Dan inilah cara menerapkannya:

#import "UIImageEffects.h"
...

self.originalImageView.image = [UIImageEffects imageByApplyingLightEffectToImage:[UIImage imageNamed:@"yourImage.png"]];
Zakaria Braksa
sumber
Bagaimana cara saya menggunakan ini dengan cepat
devjme
2
func blurBackgroundUsingImage(image: UIImage)
{
    var frame                   = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height)
    var imageView               = UIImageView(frame: frame)
    imageView.image             = image
    imageView.contentMode       = .ScaleAspectFill
    var blurEffect              = UIBlurEffect(style: .Light)
    var blurEffectView          = UIVisualEffectView(effect: blurEffect)
    blurEffectView.frame        = frame
    var transparentWhiteView    = UIView(frame: frame)
    transparentWhiteView.backgroundColor = UIColor(white: 1.0, alpha: 0.30)
    var viewsArray              = [imageView, blurEffectView, transparentWhiteView]

    for index in 0..<viewsArray.count {
        if let oldView = self.view.viewWithTag(index + 1) {
            var oldView         = self.view.viewWithTag(index + 1)
            // Must explicitly unwrap oldView to access its removeFromSuperview() method as of Xcode 6 Beta 5
            oldView!.removeFromSuperview()
        }
        var viewToInsert        = viewsArray[index]
        self.view.insertSubview(viewToInsert, atIndex: index + 1)
        viewToInsert.tag        = index + 1
    }
}
Durul Dalkanat
sumber
1

Menemukan ini secara tidak sengaja, memberi saya hasil yang sangat bagus (hampir duplikat dengan Apple) dan menggunakan kerangka Akselerasi. - http://pastebin.com/6cs6hsyQ * Tidak ditulis oleh saya

Jake
sumber
8
Ini sebenarnya kode Apple dari WWDC 2013 dengan hak cipta yang salah.
Shmidt
bukankah kode dari WWDC memiliki hak cipta, dan akses hanya diizinkan untuk anggota dengan langganan berbayar?
SAFAD
1
Mungkin saja, tetapi kode di atas saya temukan menggunakan Google. Saya belum mengubah Hak Cipta dan saya berasumsi (dan masih berasumsi) bahwa ia memiliki klaim hak cipta yang benar. Jika Apple tidak setuju, mereka harus berusaha keras untuk menghapusnya. Saya tidak melihat relevansinya.
Jake
1

Jawaban ini didasarkan pada jawaban Mitja Semolic yang sangat baik sebelumnya . Saya telah mengonversinya menjadi swift 3, menambahkan penjelasan tentang apa yang terjadi di coments, menjadikannya perpanjangan dari UIViewController sehingga setiap VC dapat memanggilnya sesuka hati, menambahkan tampilan yang tidak jelas untuk menampilkan aplikasi selektif, dan menambahkan blok penyelesaian sehingga pengendali tampilan panggilan dapat melakukan apa pun yang diinginkannya pada penyelesaian blur.

    import UIKit
//This extension implements a blur to the entire screen, puts up a HUD and then waits and dismisses the view.
    extension UIViewController {
        func blurAndShowHUD(duration: Double, message: String, completion: @escaping () -> Void) { //with completion block
            //1. Create the blur effect & the view it will occupy
            let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.light)
            let blurEffectView = UIVisualEffectView()//(effect: blurEffect)
            blurEffectView.frame = self.view.bounds
            blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]

        //2. Add the effect view to the main view
            self.view.addSubview(blurEffectView)
        //3. Create the hud and add it to the main view
        let hud = HudView.getHUD(view: self.view, withMessage: message)
        self.view.addSubview(hud)
        //4. Begin applying the blur effect to the effect view
        UIView.animate(withDuration: 0.01, animations: {
            blurEffectView.effect = blurEffect
        })
        //5. Halt the blur effects application to achieve the desired blur radius
        self.view.pauseAnimationsInThisView(delay: 0.004)
        //6. Remove the view (& the HUD) after the completion of the duration
        DispatchQueue.main.asyncAfter(deadline: .now() + duration) {
            blurEffectView.removeFromSuperview()
            hud.removeFromSuperview()
            self.view.resumeAnimationsInThisView()
            completion()
        }
    }
}

extension UIView {
    public func pauseAnimationsInThisView(delay: Double) {
        let time = delay + CFAbsoluteTimeGetCurrent()
        let timer = CFRunLoopTimerCreateWithHandler(kCFAllocatorDefault, time, 0, 0, 0, { timer in
            let layer = self.layer
            let pausedTime = layer.convertTime(CACurrentMediaTime(), from: nil)
            layer.speed = 0.0
            layer.timeOffset = pausedTime
        })
        CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, CFRunLoopMode.commonModes)
    }
    public func resumeAnimationsInThisView() {
        let pausedTime  = layer.timeOffset

        layer.speed = 1.0
        layer.timeOffset = 0.0
        layer.beginTime = layer.convertTime(CACurrentMediaTime(), from: nil) - pausedTime
    }
}

Saya telah mengkonfirmasi bahwa ia bekerja dengan iOS 10.3.1 dan iOS 11

James Jordan Taylor
sumber
1

Suplemen penting untuk jawaban @ Joey

Hal ini berlaku untuk situasi di mana Anda ingin menyajikan kabur-latar belakang UIViewControllerdengan UINavigationController.

// suppose you've done blur effect with your presented view controller
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController];

// this is very important, if you don't do this, the blur effect will darken after view did appeared
// the reason is that you actually present navigation controller, not presented controller
// please note it's "OverFullScreen", not "OverCurrentContext"
nav.modalPresentationStyle = UIModalPresentationOverFullScreen;

UIViewController *presentedViewController = [[UIViewController alloc] init]; 
// the presented view controller's modalPresentationStyle is "OverCurrentContext"
presentedViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;

[presentingViewController presentViewController:nav animated:YES completion:nil];

Nikmati!

steveluoxin
sumber
1

Swift 3 Versi dari jawaban Kev untuk mengembalikan gambar buram -

func blurBgImage(image: UIImage) -> UIImage? {
        let radius: CGFloat = 20;
        let context = CIContext(options: nil);
        let inputImage = CIImage(cgImage: image.cgImage!);
        let filter = CIFilter(name: "CIGaussianBlur");
        filter?.setValue(inputImage, forKey: kCIInputImageKey);
        filter?.setValue("\(radius)", forKey:kCIInputRadiusKey);

        if let result = filter?.value(forKey: kCIOutputImageKey) as? CIImage{

            let rect = CGRect(origin: CGPoint(x: radius * 2,y :radius * 2), size: CGSize(width: image.size.width - radius * 4, height: image.size.height - radius * 4))

            if let cgImage = context.createCGImage(result, from: rect){
                return UIImage(cgImage: cgImage);
                }
        }
        return nil;
    }
Pramod
sumber
1

Kode 2019

Inilah contoh yang lebih lengkap dengan menggunakan teknik @AdamBardon yang menakjubkan.

@IBDesignable class ButtonOrSomethingWithBlur: UIButton {

    var ba: UIViewPropertyAnimator?
    private lazy var blurry: BlurryBall = { return BlurryBall() }()

    override func didMoveToSuperview() {
        super.didMoveToSuperview()

        // Setup the blurry ball.  BE SURE TO TEARDOWN.
        // Use superb trick to access the internal guassian level of Apple's
        // standard gpu blurrer per stackoverflow.com/a/55378168/294884

        superview?.insertSubview(blurry, belowSubview: self)
        ba = UIViewPropertyAnimator(duration:1, curve:.linear) {[weak self] in
            // note, those duration/curve values are simply unusued
            self?.blurry.effect = UIBlurEffect(style: .extraLight)
        }
        ba?.fractionComplete = live.largeplaybutton_blurfactor
    }

    override func willMove(toSuperview newSuperview: UIView?) {

        // Teardown for the blurry ball - critical

        if newSuperview == nil { print("safe teardown")
            ba?.stopAnimation(true)
            ba?.finishAnimation(at: .current)
        }
    }

    override func layoutSubviews() { super.layoutSubviews()
        blurry.frame = bounds, your drawing frame or whatever
    }

{Aside: sebagai masalah umum rekayasa iOS, didMoveToWindowmungkin lebih cocok untuk Anda daripada didMoveToSuperview. Kedua, Anda dapat menggunakan beberapa cara lain untuk melakukan teardown, tetapi teardown adalah dua baris kode yang ditunjukkan di sana.}

BlurryBallhanya a UIVisualEffectView. Perhatikan init untuk tampilan efek visual. Jika Anda membutuhkan sudut bulat atau apa pun, lakukan di kelas ini.

class BlurryBall: UIVisualEffectView {

    override init(effect: UIVisualEffect?) { super.init(effect: effect)
        commonInit() }

    required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder)
        commonInit() }

    private func commonInit() {
        clipsToBounds = true
        backgroundColor = .clear
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        layer.cornerRadius = bounds.width / 2
    }
}
Fattie
sumber
0

Apple telah memberikan ekstensi untuk kelas UIImage yang disebut UIImage + ImageEffects.h. Di kelas ini Anda memiliki metode yang diinginkan untuk mengaburkan pandangan Anda

Preet
sumber
1
Bisakah Anda berbagi info lebih lanjut tentang metode ini?
Mike Laren
0

Berikut adalah kode Swift 2.0 untuk solusi yang telah disediakan dalam jawaban yang diterima :

    //only apply the blur if the user hasn't disabled transparency effects
    if !UIAccessibilityIsReduceTransparencyEnabled() {
        self.view.backgroundColor = UIColor.clearColor()

        let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.Dark)
        let blurEffectView = UIVisualEffectView(effect: blurEffect)
        //always fill the view
        blurEffectView.frame = self.view.bounds
        blurEffectView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]

        self.view.addSubview(blurEffectView) //if you have more UIViews, use an insertSubview API to place it where needed
    } else {
        self.view.backgroundColor = UIColor.blackColor()
    }
RaptoX
sumber
0

Jika menambahkan tampilan buram gelap untuk tableView, ini akan membuatnya dengan indah:

tableView.backgroundColor = .clear
let blurEffect = UIBlurEffect(style: .dark)
let blurEffectView = UIVisualEffectView(effect: blurEffect)
blurEffectView.frame = tableView.bounds
blurEffectView.autoresizingMask = [.flexibleHeight, .flexibleWidth]


// Assigning blurEffectView to backgroundView instead of addSubview to tableView makes tableView cell not blocked by blurEffectView 
tableView.backgroundView = blurEffectView
Ciao
sumber
0

Anda dapat langsung membuat Background Blur Anda menggunakan "Visual Effect View with Blur" dan "Visual Effect View with Blur and Vibrancy".

Yang harus Anda lakukan untuk membuat Blur Background di Aplikasi iOS adalah ...

  1. Pergi dan cari "Visual Effect View with Blur" di Object Library

Langkah 1 Gambar

  1. Seret "Visual Effect View with Blur" di Storyboard Anda dan aturlah ...

Langkah 2 Gambar

  1. Akhirnya ... Anda membuat Latar Belakang Aplikasi Anda Buram!

Tata Letak Aplikasi sebelum mengklik Tombol apa saja!

Tampilan Aplikasi Setelah Mengklik Tombol yang membuat seluruh latar belakang aplikasi Buram!

Temui Patel
sumber
0

Dalam hal ini membantu siapa pun, berikut adalah ekstensi cepat yang saya buat berdasarkan jawaban oleh Jordan H. Itu ditulis dalam Swift 5 dan dapat digunakan dari Objective C.

extension UIView {

    @objc func blurBackground(style: UIBlurEffect.Style, fallbackColor: UIColor) {
        if !UIAccessibility.isReduceTransparencyEnabled {
            self.backgroundColor = .clear

            let blurEffect = UIBlurEffect(style: style)
            let blurEffectView = UIVisualEffectView(effect: blurEffect)
            //always fill the view
            blurEffectView.frame = self.self.bounds
            blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]

            self.insertSubview(blurEffectView, at: 0)
        } else {
            self.backgroundColor = fallbackColor
        }
    }

}

CATATAN: Jika Anda ingin mengaburkan latar belakang UILabel tanpa memengaruhi teks, Anda harus membuat wadah UIView, tambahkan UILabel ke wadah UIView sebagai subview, setel latar belakang UILabel ke UIColor.clear, lalu panggil blurBackground (gaya : UIBlurEffect.Style, fallbackColor: UIColor) pada wadah UIView. Berikut adalah contoh cepat dari ini yang ditulis dalam Swift 5:

let frame = CGRect(x: 50, y: 200, width: 200, height: 50)
let containerView = UIView(frame: frame)
let label = UILabel(frame: frame)
label.text = "Some Text"
label.backgroundColor = UIColor.clear
containerView.addSubview(label)
containerView.blurBackground(style: .dark, fallbackColor: UIColor.black)
Tyler Wood
sumber
-1

Swift 4:

Untuk menambahkan overlay, atau tampilan sembulan Anda juga dapat menggunakan Tampilan Penampung yang dengannya Anda mendapatkan Pengontrol Tampilan gratis (Anda mendapatkan Tampilan Penampung dari palet / pustaka objek biasa)

Langkah:

Miliki Tampilan (ViewForContainer dalam pic) yang menampung Tampilan Kontainer ini, untuk meredupkannya ketika konten Tampilan Kontainer ditampilkan. Hubungkan outlet di dalam View Controller pertama

Sembunyikan tampilan ini saat VC pertama dimuat

Tampil saat Tombol diklik masukkan deskripsi gambar di sini

Untuk meredupkan Tampilan ini saat konten Tampilan Kontainer ditampilkan, atur Tampilan Latar Belakang ke Hitam dan opacity menjadi 30%

Saya telah menambahkan jawaban untuk penciptaan tampilan popview di pertanyaan Stackoverflow lainnya https://stackoverflow.com/a/49729431/5438240

Naishta
sumber
-3

Jawaban sederhana adalah Tambahkan subview dan ubah alfa-nya.

UIView *mainView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
UIView *subView = [[UIView alloc] initWithFrame:popupView.frame];
UIColor * backImgColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"blue_Img.png"]];
subView.backgroundColor = backImgColor;
subView.alpha = 0.5;
[mainView addSubview:subView];
Sohail
sumber