Yeni iOS'un Müzik uygulamasında, görünümün arkasında onu bulanıklaştıran bir albüm kapağı görebiliriz.
Böyle bir şey nasıl başarılabilir? Belgeleri okudum ama orada hiçbir şey bulamadım.
Yeni iOS'un Müzik uygulamasında, görünümün arkasında onu bulanıklaştıran bir albüm kapağı görebiliriz.
Böyle bir şey nasıl başarılabilir? Belgeleri okudum ama orada hiçbir şey bulamadım.
Yanıtlar:
Kullanabilirsiniz UIVisualEffectView
Bu 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.
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)
UIAccessibilityIsReduceTransparencyEnabled()
.
Ekran görüntüsünde bu görüntü durağan olduğu CIGaussianBlur
iç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;
}
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 applyLightEffect
Accelerate.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ç; }
İndieambitions.com adresinden: vImage kullanarak bir bulanıklık gerçekleştirin . Algoritma ayrıca iOS-RealTimeBlur'da da kullanılır .
Nick Lockwood'dan: https://github.com/nicklockwood/FXBlurView Örnek, kaydırma görünümü üzerindeki bulanıklığı gösterir. Dispatch_async ile bulanıklaşır, daha sonra güncellemeleri çağırmak için UITrackingRunLoopMode ile senkronize edilir, böylece UIKit UIScrollView kaydırmasına daha fazla öncelik verdiğinde bulanıklık gecikmez. Bu, Nick'in harika olan iOS Core Animation adlı kitabında açıklanmıştır .
iOS-blur Bu, UIToolbar'ın bulanık katmanını alır ve başka bir yere koyar. Bu yöntemi kullanırsanız Apple uygulamanızı reddeder. Bkz. Https://github.com/mochidev/MDBlurView/issues/4
Evadne blogundan: LiveFrost: Hızlı, Senkron UIView Anlık Görüntü Dönüşümü . Büyük kod ve harika bir okuma. Bu yayından bazı fikirler:
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/
UIImage
Aksi 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 ...
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.
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.
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 UIToolbar
yerine 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 -viewDidLoad
aş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!
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.
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!
İş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;
}
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..
(NSClassFromString("_UICustomVibrancyEffect") as! UIVibrancyEffect.Type).init()
Gerçekten biraz yardım takdir ediyorum!
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
/ UITableView
hücreler için uygun değildir
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 :)
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 Over
stilleri kullanın .
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)
Daha fazla kontrol isteyen insanlar için Apple'ın UIImageEffects
örnek kodunu kullanabilirsiniz.
İçin kodu UIImageEffects
Apple'ın Geliştirici Kitaplığı'ndan kopyalayabilirsiniz : Görüntüyü Bulanıklaştırma ve Renklendirme
#import "UIImageEffects.h"
...
self.originalImageView.image = [UIImageEffects imageByApplyingLightEffectToImage:[UIImage imageNamed:@"yourImage.png"]];
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
}
}
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
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
@ Joey'nin cevabına önemli bir ek
Bu, bir bulanık-arka planı sunmak istiyorum bir durum için geçerlidir UIViewController
ile 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!
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;
}
İş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, didMoveToWindow
sizin 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.}
BlurryBall
sadece 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
}
}
Apple, UIImage sınıfı için UIImage + ImageEffects.h adlı bir uzantı sağladı. Bu sınıfta, görüşünüzü bulanıklaştırmak için istediğiniz yöntemlere sahipsiniz
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()
}
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
"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 ...
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ü!
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)
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
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];