Di aplikasi Musik iOS baru, kita dapat melihat sampul album di belakang tampilan yang mengaburkannya.
Bagaimana hal seperti itu dapat dicapai? Saya sudah membaca dokumentasi, tetapi tidak menemukan apa pun di sana.
Di aplikasi Musik iOS baru, kita dapat melihat sampul album di belakang tampilan yang mengaburkannya.
Bagaimana hal seperti itu dapat dicapai? Saya sudah membaca dokumentasi, tetapi tidak menemukan apa pun di sana.
Jawaban:
Anda dapat menggunakan UIVisualEffectView
untuk 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.
insertSubView:belowSubView:
komentar dalam kode ini, saya telah menggunakan yang berikut untuk mengatur blur sebagai latar belakang tampilan:view.insertSubview(blurEffectView, atIndex: 0)
UIAccessibilityIsReduceTransparencyEnabled()
.
Karena gambar dalam tangkapan layar itu statis, Anda dapat menggunakan CIGaussianBlur
dari 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;
}
Dalam sesi "Implementing Engaging UI di iOS" dari WWDC 2013 Apple menjelaskan cara membuat latar belakang kabur (pukul 14:30), dan menyebutkan metode yang applyLightEffect
diterapkan 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; }
Dari indieambitions.com: Lakukan blur menggunakan vImage . Algoritma ini juga digunakan di iOS-RealTimeBlur .
Dari Nick Lockwood: https://github.com/nicklockwood/FXBlurView Contoh ini menunjukkan blur pada tampilan gulir. Itu kabur dengan dispatch_async, kemudian disinkronkan untuk memanggil pembaruan dengan UITrackingRunLoopMode sehingga kabur tidak tertinggal ketika UIKit memberikan prioritas lebih ke gulir UIScrollView. Ini dijelaskan dalam buku Nick iOS Core Animation , yang bagus.
iOS-blur Ini mengambil lapisan kabur dari UIToolbar dan meletakkannya di tempat lain. Apple akan menolak aplikasi Anda jika Anda menggunakan metode ini. Lihat https://github.com/mochidev/MDBlurView/issues/4
Dari blog Evadne: LiveFrost: Fast, Synchronous UIView Snapshot Convolving . Kode yang bagus dan baca yang bagus. Beberapa ide dari pos ini:
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/
UIImage
sebaliknya itu akan terlihat terlalu besar pada perangkat Retina ...
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 ..
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.
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 UIToolbar
alih-alih UIView
. Anda bahkan dapat melakukannya dengan UIViewController
's view
properti, misalnya ...
1) buat kelas baru yang merupakan "Subkelas" UIViewController
dan 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 -viewDidLoad
metodenya, 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!
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 self
adalah subkelas dari UIToolbar
)
UIColor *color = [UIColor blueColor]; // for example
self.barTintColor = [color colorWithAlphaComponent:0.5];
Ini akan memberi warna biru pada tampilan kabur.
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!
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;
}
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..
(NSClassFromString("_UICustomVibrancyEffect") as! UIVibrancyEffect.Type).init()
Sangat menghargai bantuan!
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
/ UITableView
sel
Dari Xcode Anda dapat melakukannya dengan mudah. Ikuti langkah-langkah dari xcode. Drage tampilan efek visual pada tampilan tampilan atau gambar Anda.
Selamat Coding :)
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 Over
gaya lain .
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)
Untuk orang-orang yang ingin lebih banyak kontrol, Anda dapat menggunakan UIImageEffects
kode sampel Apple .
Anda dapat menyalin kode UIImageEffects
dari Perpustakaan Pengembang Apple: Memburamkan dan Mewarnai Gambar
#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
}
}
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
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
Suplemen penting untuk jawaban @ Joey
Hal ini berlaku untuk situasi di mana Anda ingin menyajikan kabur-latar belakang UIViewController
dengan 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!
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;
}
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, didMoveToWindow
mungkin 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.}
BlurryBall
hanya 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
}
}
Apple telah memberikan ekstensi untuk kelas UIImage yang disebut UIImage + ImageEffects.h. Di kelas ini Anda memiliki metode yang diinginkan untuk mengaburkan pandangan Anda
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()
}
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
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 ...
Tata Letak Aplikasi sebelum mengklik Tombol apa saja!
Tampilan Aplikasi Setelah Mengklik Tombol yang membuat seluruh latar belakang aplikasi Buram!
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)
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
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];