Bulanık bir bindirme görünümü oluşturma


Yanıtlar:


552

Kullanabilirsiniz UIVisualEffectViewBu efekti elde etmek . Bu, performans ve mükemmel pil ömrü için ince ayar yapılmış yerel bir API'dır, ayrıca uygulanması kolaydır.

Swift:

//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
}

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

Altta yatan içeriği bulanıklaştırmak için bu görünüm denetleyicisini modal olarak sunuyorsanız, kalıcı sunum stilini Aşırı Akım Bağlamına ayarlamanız ve altta yatan görünüm denetleyicisinin üst üste sunulduktan sonra görünür kalmasını sağlamak için arka plan rengini temizlemeniz gerekir.


7
insertSubView:belowSubView:Bu koddaki açıklamaya bir açıklama olarak, bulanıklığı görünümün arka planı olarak ayarlamak için aşağıdakileri kullandım:view.insertSubview(blurEffectView, atIndex: 0)
Michael Voccola

2
Yukarıdaki cevaba atıfta bulunarak, "if (! UIAccessibilityIsReduceTransparencyEnabled ())" öğesini kontrol etmek gerekli mi yoksa atlayabilir miyiz?
GKK

3
Görünüm denetleyicinizi sunuyorsanız, arka plan rengini temiz olarak ayarlamanın yanı sıra modalPresentationStyle = .overCurrentContext'i değiştirdiğinizden emin olun
Shardul

3
Harika çalışıyor !!! Tek bir değişiklik gerekiyor: [self.view insertSubview: blurEffectView atIndex: 1];
Abhishek Thapliyal

2
İOS 11'de manuel olarak kontrol etmenin gerekli olmadığını düşünüyorum UIAccessibilityIsReduceTransparencyEnabled().
Nate Whittaker

284

Çekirdek Görüntü

Ekran görüntüsünde bu görüntü durağan olduğu CIGaussianBluriçin Core Image'dan (iOS 6 gerektirir) kullanabilirsiniz. İşte örnek: https://github.com/evanwdavis/Fun-with-Masks/blob/master/Fun%20with%20Masks/EWDBlurExampleVC.m

Dikkat edin, bu sayfadaki diğer seçeneklerden daha yavaştır.

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

Yığın bulanıklaştırma (Kutu + Gaussian)

  • StackBlur Bu, Box ve Gauss bulanıklığının bir karışımını uygular. Hızlandırılmamış gaussiandan 7 kat daha hızlı, ancak kutu bulanıklığı kadar çirkin değil. Burada (Java eklentisi sürümü) veya burada (JavaScript sürümü) bir demoya bakın . Bu algoritma KDE ve Camera + ve diğerlerinde kullanılır. Hızlandırma Çerçevesini kullanmaz, ancak hızlıdır.

Çerçeveyi Hızlandırın

  • WWDC 2013'ten “iOS'ta İlgi Çekici Kullanıcı Arayüzünün Uygulanması” oturumunda Apple, bulanık bir arka planın nasıl oluşturulacağını açıklar (14:30) ve applyLightEffectAccelerate.framework kullanarak örnek kodda uygulanan bir yöntemden bahseder .

  • GPUImage , dinamik bulanıklaştırma oluşturmak için OpenGL gölgelendiricileri kullanır. Birkaç bulanıklık türüne sahiptir: GPUImageBoxBlurFilter, GPUImageFastBlurFilter, GaussianSelectiveBlur, GPUImageGaussianBlurFilter. “İOS 7'nin kontrol paneli tarafından sağlanan bulanıklık efektini tamamen kopyalaması gereken” bir GPUImageiOSBlurFilter bile var ( tweet , makale ). Makale ayrıntılı ve bilgilendirici.

    - (UIImage *) blurryGPUImage: (UIImage *) görüntü ile BlurLevel: (NSInteger) blur {
        GPUImageFastBlurFilter * blurFilter = [GPUImageFastBlurFilter yeni];
        blurFilter.blurSize = bulanıklık;
        UIImage * sonuç = [blurFilter imageByFilteringImage: image];
        sonuç;
    }

Diğer şey

Andy Matuschak Twitter'da şunları söyledi : “bilirsiniz, gerçek zamanlı olarak yaptığımız birçok yer, akıllı numaralarla statik.”

At doubleencore.com derler “biz bu 10 punto bulanıklık yarıçapı artı çoğu koşulda doygunluk içinde 10 nk artış iyi taklit iOS 7'nin bulanıklık efekti buldum”.

Apple SBFProceduralWallpaperView özel başlıklarına bir göz atın .

Son olarak, bu gerçek bir bulanıklık değil, ancak pikselli bir görüntü elde etmek için rasterizationScale ayarlayabileceğinizi unutmayın: http://www.dimzzy.com/blog/2010/11/blur-effect-for-uiview/


Cevap için teşekkürler! Bir sorun çözüldü. Ama bir sorunumuz daha var. İOS 7'de kapak resmi nasıl alınır? Mümkünse?
kondratyevdev

Telefonunuzdan arka plan duvar kağıdı görüntüsünü nasıl alacağınızı kastediyorsanız, bu noktada hiçbir fikrim yok. API işlevlerinde bu işlevselliği görmedim . Belki de özel bir API kullanıyor.
Jano

Fark ettiğim bir şey (ve tamamen yanlış olabilirim), Apple'ın bulanıklığının da küçük bir renk doygunluğu kattığı görülüyor. Yani, bunun basit bir gauss bulanıklığı olduğunu düşünmüyorum.
xtravar

UIImageAksi halde geri dönerken ölçek faktörünü hatırlayın aksi takdirde bir Retina cihazında çok büyük görünecek ...
Stephen Darlington

Bu etkinin performansı düşürmeden bir UITableViewCell'e uygulanıp uygulanamayacağını biliyor musunuz?
Leonardo

15

Sadece bu soruda daha fazla seçenek sunmak için kabul edilen cevaptan yazılı bir Objective-C versiyonu yayınlamaya karar verdim.

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

Sadece portre modunu destekliyorsanız veya sadece bu fonksiyonu kullanmak için bir bayrak ekliyorum ya da kullanmamaya çalışıyorsanız, kısıtlamalar kaldırılabilir.


1
yeni arkadaşlar (ben) için yukarıdaki yöntemi çağırmanın bir yolu şudur: [self cameraBlurToView: self.view withEffectStyle: UIBlurEffectStyleDark andConstraints: YES]; (teşekkür ederim NorthBlast)
tmr

14

Ben kodu göndermek için izin verilmiyor sanmıyorum, ama WWDC örnek kod bahseden yukarıdaki yazı doğru. Bağlantı şu şekildedir: https://developer.apple.com/downloads/index.action?name=WWDC%202013

Aradığınız dosya UIImage'daki kategoridir ve yöntem ApplyLightEffect'dir.

Yukarıda bir yorumda belirttiğim gibi, Apple Blur'un doygunluğu ve bulanıklığın yanı sıra başka şeyler de var. Basit bir bulanıklık yapmaz ... eğer tarzlarını taklit etmek istiyorsanız.


8
Bu bağlantı koptu. İşte doğru bağlantı: developer.apple.com/downloads/index.action?name=WWDC%202013
olivaresF

Bu örnek kodun XCode 5.0 ve iOS SDK 7.0 (henüz herkese açık olarak yayınlanmamış) gerektirdiğini unutmayın
Mike Gledhill

Sabit bağlantı için teşekkürler, ancak içinde birkaç örnek kod var, hangisi ilgili UIImage kategorisini içeriyor?
Leonardo

1
@Leonardo iOS_RunningWithASnap.zip
John Starr Dewar

1
... veya iOS_UIImageEffects.zip daha spesifik olarak sadece budur.
John Starr Dewar

9

Bunun en kolay çözümünün, iOS 7'de arkasındaki her şeyi bulanıklaştıran UIToolbar'ı geçersiz kılmak olduğunu düşünüyorum. Oldukça sinsi, ancak uygulaması çok basit ve hızlı!

Herhangi bir görünümle yapabilirsiniz, sadece UIToolbaryerine bir alt sınıf yapın UIView. Hatta bir ile yapabilirsinizUIViewController bireyin viewörneğin, mülkiyet ...

1) "Alt sınıfı" olan yeni bir sınıf oluşturun UIViewController ve "Kullanıcı arabirimi için XIB ile" kutusunu işaretleyin.

2) Görünüm'ü seçin ve sağ paneldeki kimlik denetçisine gidin (alt-komut-3). "Sınıf" ıUIToolbar . Şimdi nitelik denetçisine (alt-command-4) gidin ve "Arka Plan" rengini "Rengi Temizle" olarak değiştirin.

3) Ana görünüme bir alt görünüm ekleyin ve bunu arayüzünüzdeki bir IBOutlet'e bağlayın. Arayın backgroundColorView. Gerçekleştirme ( .m) dosyasındaki özel bir kategori olarak şöyle görünecektir .

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

4) Görünüm denetleyicisi uygulamasına gidin (.m ) dosyasına gidin ve -viewDidLoadaşağıdaki gibi bakmak için yöntemi değiştirin :

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

Bu, arkasındaki her şeyi bulanıklaştıran koyu gri bir görünüm verecektir. OS / SDK tarafından sağlanan her şeyi parmaklarınızın ucunda kullanarak komik iş, yavaş çekirdek görüntü bulanıklığı yok.

Bu görünüm denetleyicisinin görünümünü aşağıdaki gibi başka bir görünüme ekleyebilirsiniz:

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

// animate the self.blurViewController into view

Bir şey net değilse bana bildirin, yardımcı olmaktan memnuniyet duyarız!


Düzenle

UIToolbar 7.0.3'te değiştirilerek renkli bir bulanıklık kullanılırken istenmeyen bir etki oluştu.

Eskiden renk ayarlayabiliyorduk barTintColor , ancak bunu daha önce yapıyorsanız, alfa bileşenini 1'den daha düşük bir değere ayarlamanız gerekir. Aksi takdirde UIToolbar'ınız tamamen opak renkte olur - bulanıklık olmadan.

Bu şu şekilde elde edilebilir: (akılda bulundurmak self, bir alt sınıftır UIToolbar)

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

Bu, bulanık görünüme mavi bir renk tonu verecektir.


1
Kötü adam değil. Bence bu üç çizgiyi kullandım: self.backgroundColorView.opaque = NO; self.backgroundColorView.alpha = 0.5; self.backgroundColorView.backgroundColor = [UIColor colorWithWhite:0.3 alpha:1];Ama arka plan bulanık değil, sadece güzel bir etki yaratın. Yine de teşekkürler!
IgniteCoders

1
Bu tekniği kullanarak hiç bulanıklık görmüyorum. Sadece renkli bir katman oluşturur.
MusiGenesis

renkli bindirme alfa değerinin 1'den küçük olduğundan emin olun. Görünüm denetleyicisi olmadan, ihtiyacınız olan şeye bağlı olarak daha basit olabilecek bir UIToolbar kullanabilirsiniz.
Sam

temiz hile adam. Görüşümü film şeridinde UIToolbar sınıfına dönüştürdüm, sonra görünüm arka planını renksiz olarak değiştirdim. Beyaz arka plan bulanık verdi. Alfa'yı 1'den az yaparsanız bulanık efekt kaybolur.
Badr

9

İşte Swift'te CIGaussianBlur kullanarak hızlı bir uygulama:

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

7

Özel bulanıklaştırma ölçeği

UIVisualEffectViewÖzel ayarı şu şekilde deneyebilirsiniz -

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)
    }   
}

Çıktı: - için blurEffect.setValue(1...& blurEffect.setValue(2.. resim açıklamasını buraya girin resim açıklamasını buraya girin


3
Bu parametrenin iOS adının bir sonraki sürümünde değiştirilirse çalışmayı durduracaktır.
Ariel Bogdziewicz

@ArielBogdziewicz şu anda çalışıyor. wwdc herhangi bir API varyasyonu varsa güncelleyecektir.
Jack

Hmm ... hayır, asla özel API'lara erişmek istemezsiniz. Bir sebepten dolayı özeldirler. Değişecekler, kırılacaklar ve / veya Apple uygulamanızı reddedecek. Başka bir yöntem kullanın, bolca var. Hack bulmak için Kudos, ama, önerilmez.
n13

@Jack Bu cevap için çok teşekkür ederim! Sorunum için bulduğum tek çözüm: bir görünümü başka bir görünümün konumuna göre bulanıklaştırmak. Yine de başka bir sorum daha var. UIBlurEffect'imin üstüne canlılık katmanın bir yolu var mı? Öyleyse nasıl? Bunun için blurView cihazımın üstüne başka bir görünüm oluşturmam gerekir mi? Ben denedim ama kullandığımda her zaman çöktü (NSClassFromString("_UICustomVibrancyEffect") as! UIVibrancyEffect.Type).init()Gerçekten biraz yardım takdir ediyorum!
Moritz

@ Moritz denemedi. Ama işe yaramalı. Deneyebilir ve kontrol edebilirsiniz.
Jack

7

UIViewPropertyAnimator kullanarak özel API'lerle pazarlık etmeden özel bulanıklık eklemenin kolay bir yolu :

İlk olarak, sınıf özelliğini bildirin:

var blurAnimator: UIViewPropertyAnimator!

Ardından bulanıklık görünümünüzü şu şekilde ayarlayın 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.    

Not: Bu çözelti UICollectionView/ UITableViewhücreler için uygun değildir


1
UIVisualEffectView'ın saydamlığını kontrol etmek istiyorsanız bulduğum tek çözüm budur.
Denis Kutlubaev

6

resim açıklamasını buraya girin

Xcode'dan kolayca yapabilirsiniz. Xcode'daki adımları izleyin. Uiview veya görsel görünümünüzde görsel efekt görünümünü sıralayın.

Mutlu Kodlama :)


5

Kabul edilen cevap doğrudur, ancak arka plan bulanıklığını istediğiniz bu görünümün kullanılarak sunulması durumunda burada önemli bir adım eksiktir.

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

Varsayılan olarak, UIKit sunum yapan kişinin aslında bulanıklaştırdığınız görünümünü kaldırdığından bulanıklığı ortadan kaldırır. Bu kaldırmayı önlemek için bu satırı bir öncekinden önce ekleyin

vc.modalPresentationStyle = UIModalPresentationOverFullScreen;

Veya diğer Overstilleri kullanın .


3

AMAÇ-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)

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


2

UIImageEffects Kullanma

Daha fazla kontrol isteyen insanlar için Apple'ın UIImageEffectsörnek kodunu kullanabilirsiniz.

İçin kodu UIImageEffectsApple'ın Geliştirici Kitaplığı'ndan kopyalayabilirsiniz : Görüntüyü Bulanıklaştırma ve Renklendirme

İşte nasıl uygulanacağı:

#import "UIImageEffects.h"
...

self.originalImageView.image = [UIImageEffects imageByApplyingLightEffectToImage:[UIImage imageNamed:@"yourImage.png"]];

Bunu hızlı bir şekilde nasıl kullanırım
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
    }
}

1

Bunu kazara buldum, gerçekten harika (Apple'ın kopyalarıyla) sonuçları veriyor ve Hızlandırma çerçevesini kullanıyor. - http://pastebin.com/6cs6hsyQ * Bana yazmadım


8
Aslında WWDC 2013'ten gelen yanlış telif hakkı olan Apple kodu.
Shmidt

WWDC kodları telif hakkıyla korunmuyor ve yalnızca ücretli abonelikleri olan üyelere erişim izni var mı?
SAFAD

1
Muhtemelen, ancak yukarıdaki kodu Google'ı kullanarak buldum. Telif Hakkını değiştirmedim ve telif hakkı talebinin doğru olduğunu varsayıyorum (ve yine de varsayıyorum). Eğer Apple buna katılmazsa, çabalarını düşürmek için çaba göstermelidirler. Alaka düzeyini görmüyorum.
Jake

1

Bu cevap Mitja Semolic'in mükemmel önceki cevabına dayanıyor . Hızlı 3'e dönüştürdüm, coments'ta neler olduğuna bir açıklama ekledim, herhangi bir VC'nin istediği gibi çağırabileceği bir UIViewController uzantısı yaptı, seçici uygulamayı göstermek için bulanık olmayan bir görünüm ekledim ve bir tamamlama bloğu ekledim. çağıran görünüm denetleyicisi bulanıklığın tamamlanmasıyla istediği her şeyi yapabilir.

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

Hem iOS 10.3.1 hem de iOS 11 ile çalıştığını doğruladım


1

@ Joey'nin cevabına önemli bir ek

Bu, bir bulanık-arka planı sunmak istiyorum bir durum için geçerlidir UIViewControllerile 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];

Zevk almak!


1

Swift'in bulanık görüntüyü döndürme cevabının Swift 3 versiyonu -

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

1

2019 kodu

İşte şaşırtıcı @AdamBardon tekniğini kullanan daha dolgun bir örnek.

@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
    }

{Kenara: genel bir iOS mühendislik meselesi olarak, didMoveToWindowsizin için daha uygun olabilir didMoveToSuperview. İkinci olarak, ayırmayı yapmak için başka bir yol kullanabilirsiniz, ancak ayırma burada gösterilen iki kod satırıdır.}

BlurryBallsadece bir UIVisualEffectView. Görsel efektler görünümü için girişlere dikkat edin. Yuvarlatılmış köşelere veya başka bir şeye ihtiyacınız olursa, bu sınıfta yapın.

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


0

Kabul edilen yanıtta sağlanan çözüm için Swift 2.0 kodu :

    //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()
    }

0

TableView için karanlık bir bulanıklık görünümü eklerse, bu güzel bir şekilde yapar:

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

0

"Bulanıklık ile Görsel Efekt Görünümü" ve "Bulanıklık ve Canlılık ile Görsel Efekt Görünümü" kullanarak Arka Plan Bulanıklığınızı doğrudan yapabilirsiniz.

İOS Uygulamasında Blur Arkaplanı yapmak için yapmanız gereken tek şey ...

  1. Git ve Nesne Kitaplığında "Bulanıklıkla Görsel Efekt Görünümü" araması yap

Adım 1 Görüntü

  1. Storyboard'unuzdaki "Bulanıklaştırılmış Görsel Efekt Görünümü" nü sürükleyin ve ayarlayın ...

Adım 2 Görüntü

  1. Sonunda ... Uygulama Arkaplan Bulanıklığı olun!

Herhangi bir Düğmeye tıklamadan önce Uygulama Düzeni!

Tüm uygulama arka plan Blur yapar Düğmesine Tıkladıktan Sonra Uygulama Görünümü!


0

Bunun herkese yardımcı olması durumunda, Jordan H'nin cevabına dayanarak oluşturduğum hızlı bir uzantı. Swift 5'de yazılmıştır ve Objective C'den kullanılabilir.

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

}

NOT: Metni etkilemeden bir UILabel'ın arka planını bulanıklaştırmak istiyorsanız, bir kapsayıcı UIView oluşturmanız, UILabel'ı UIView kapsayıcısına alt görünüm olarak eklemeniz, UILabel'ın backgroundColor değerini UIColor.clear olarak ayarlamanız ve sonra blurBackground (style) : UIBlurEffect.Style, fallbackColor: UIColor) konteyner UIView üzerinde. Swift 5 ile yazılmış bunun kısa bir örneği:

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)

-1

Hızlı 4:

Bir yer paylaşımı veya açılır pencere görünümü eklemek için Ücretsiz bir Görünüm Denetleyicisi aldığınız Konteyner Görünümü'nü de kullanabilirsiniz (Konteyner Görünümü'nü normal nesne paletinden / kitaplığından alırsınız)

Adımlar:

Kapsayıcı Görünümü'nün içeriği görüntülendiğinde onu karartmak için bu Kapsayıcı Görünümü'nü tutan bir Görünüme (resimdeki ViewForContainer) sahip olun. İlk Görünüm Denetleyicisinin içindeki prizi bağlayın

1. VC yüklendiğinde bu Görünümü gizle

Düğme tıklatıldığında gösterme Resim açıklamasını buraya girin

Kapsayıcı Görünümü içeriği görüntülendiğinde bu Görünümü kısmak için Görünüm Arka Planını Siyah ve opaklığı% 30 olarak ayarlayın

Diğer Stackoverflow sorusunda popview görünümü oluşturmaya bir cevap ekledim https://stackoverflow.com/a/49729431/5438240


-3

Basit cevap bir alt görünüm eklemek ve alfa değiştirmek olduğunu.

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];
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.