새로운 iOS의 음악 앱에서 앨범 표지가 흐리게 보이는보기를 볼 수 있습니다.
어떻게 그런 일을 할 수 있습니까? 설명서를 읽었지만 거기에서 아무것도 찾지 못했습니다.
새로운 iOS의 음악 앱에서 앨범 표지가 흐리게 보이는보기를 볼 수 있습니다.
어떻게 그런 일을 할 수 있습니까? 설명서를 읽었지만 거기에서 아무것도 찾지 못했습니다.
답변:
UIVisualEffectView
이 효과를 얻기 위해 사용할 수 있습니다 . 이것은 성능과 배터리 수명을 위해 미세 조정 된 고유 한 API이며 구현하기도 쉽습니다.
빠른:
//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
}
목표 -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];
}
기본 컨텐츠를 흐리게하기 위해이보기 컨트롤러를 모달로 표시하는 경우, 모달 프리젠 테이션 스타일을 현재 컨텍스트 이상으로 설정하고 배경색을 선명하게 설정하여 기본보기 컨트롤러가 위에 표시되면 계속 표시되도록해야합니다.
insertSubView:belowSubView:
이 코드 의 주석을 명확하게하기 위해 다음을 사용하여 흐림을보기의 배경으로 설정했습니다.view.insertSubview(blurEffectView, atIndex: 0)
UIAccessibilityIsReduceTransparencyEnabled()
.
스크린 샷의 이미지는 정적이므로 CIGaussianBlur
Core Image에서 사용할 수 있습니다 (iOS 6 필요). 샘플은 다음과 같습니다. https://github.com/evanwdavis/Fun-with-Masks/blob/master/Fun%20with%20Masks/EWDBlurExampleVC.m
이 페이지의 다른 옵션보다 속도가 느립니다.
#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 Apple의 “iOS에서 Engaging UI 구현”세션에서 배경을 흐리게 만드는 방법 (14:30에)을 설명하고 applyLightEffect
Accelerate.framework를 사용하여 샘플 코드에서 구현 된 방법에 대해 언급합니다 .
GPUImage 는 OpenGL 쉐이더를 사용하여 동적 흐림 효과를 만듭니다. GPUImageBoxBlurFilter, GPUImageFastBlurFilter, GaussianSelectiveBlur, GPUImageGaussianBlurFilter와 같은 여러 유형의 흐림 효과가 있습니다. “iOS 7의 제어판에서 제공하는 흐림 효과를 완전히 복제해야합니다”( tweet , article ) 의 GPUImageiOSBlurFilter도 있습니다 . 이 기사는 상세하고 유익합니다.
-(UIImage *) blurryGPUImage : (UIImage *) BlurLevel이있는 이미지 : (NSInteger) blur { GPUImageFastBlurFilter * blurFilter = [GPUImageFastBlurFilter 새로운 기능]; blurFilter.blurSize = 흐림; UIImage * result = [blurFilter imageByFilteringImage : image]; 결과 반환; }
indieambitions.com에서 : vImage를 사용하여 흐림 효과를 수행하십시오 . 이 알고리즘은 iOS-RealTimeBlur 에서도 사용됩니다 .
Nick Lockwood에서 : https://github.com/nicklockwood/FXBlurView 이 예는 스크롤보기에서의 흐림 효과를 보여줍니다. dispatch_async로 흐리게 처리 한 다음 UITrackingRunLoopMode를 사용하여 업데이트를 호출하도록 동기화하므로 UIKit이 UIScrollView의 스크롤에 더 높은 우선 순위를 부여하면 흐림이 지연되지 않습니다. 이 내용은 Nick의 저서 iOS Core Animation에 설명되어 있습니다.
아이폰 OS는 흐림 이것은 UIToolbar 다른 곳 박았을의 흐리게 계층을합니다. 이 방법을 사용하면 Apple에서 앱을 거부합니다. https://github.com/mochidev/MDBlurView/issues/4를 참조 하십시오.
Evadne 블로그에서 : LiveFrost : 빠르고 동기화 된 UIView Snapshot Convolving . 훌륭한 코드와 훌륭한 읽기. 이 게시물의 일부 아이디어 :
Andy Matuschak 은 트위터에서“우리가 실시간으로하는 것처럼 보이는 많은 장소는 영리한 속임수로 정체되어있다”고 말했다.
에서 doubleencore.com을 그들이 말하는 "우리는 10 백금 흐림 반경 플러스 대부분의 상황에서 채도 10 백금 증가 최선을 모방 아이폰 OS 7의 흐림 효과를 발견했습니다."
Apple의 SBFProceduralWallpaperView 의 개인 헤더를 살펴 보십시오 .
마지막으로, 이것은 실제 흐림은 아니지만 픽셀 화 된 이미지를 얻도록 rasterizationScale을 설정할 수 있습니다. http://www.dimzzy.com/blog/2010/11/blur-effect-for-uiview/
UIImage
그렇지 않으면 돌아올 때 스케일 팩터를 기억하십시오. 그렇지 않으면 Retina 장치에서 너무 크게 보일 것입니다.
나는이 질문에 더 많은 옵션을 제공하기 위해 허용 된 답변에서 서면 Objective-C 버전을 게시하기로 결정했습니다.
- (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;
}
세로 모드 만 지원 하거나이 기능에 플래그를 추가하여 사용 여부를 원할 경우 제약 조건을 제거 할 수 있습니다.
코드를 게시 할 수는 없지만 WWDC 샘플 코드를 언급 한 위의 게시물은 정확합니다. 여기 링크가 있습니다: https://developer.apple.com/downloads/index.action?name=WWDC%202013
찾고있는 파일은 UIImage의 범주이며, 메서드는 applyLightEffect입니다.
위에서 언급 한 바와 같이 Apple Blur에는 채도 외에도 흐림 효과가 있습니다. 스타일을 모방하려는 경우 간단한 흐림 효과가 적용되지 않습니다.
iOS 7에서는 UIToolbar를 무시하는 것이 가장 쉬운 해결책이라고 생각합니다. iOS 7에서는 모든 것을 흐리게합니다.
어떤 뷰에서든 할 수 있습니다 . UIToolbar
대신의 서브 클래스로 만드십시오 UIView
. 예를 들어 UIViewController
의 view
속성 으로 할 수도 있습니다 .
1) "하위 클래스"인 새 클래스를 작성하고 UIViewController
"사용자 인터페이스 용 XIB 사용"상자를 선택하십시오.
2)보기를 선택하고 오른쪽 패널 (alt-command-3)의 자격 증명 관리자로 이동합니다. "클래스"를 다음으로 변경하십시오.UIToolbar
. 이제 속성 관리자 (alt-command-4)로 이동하여 "Background"색상을 "Clear Color"로 변경하십시오.
3) 서브 뷰를 기본보기에 추가하고 인터페이스의 IBOutlet에 연결하십시오. 를 호출합니다 backgroundColorView
. 구현 ( .m
) 파일 의 개인 범주로 다음과 같이 보입니다 .
@interface BlurExampleViewController ()
@property (weak, nonatomic) IBOutlet UIView *backgroundColorView;
@end
4) view controller implementation ( .m
) 파일로 이동 하여 -viewDidLoad
메소드를 다음과 같이 변경하십시오 .
- (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];
}
이렇게하면 어두운 회색으로 표시되어 뒤에있는 모든 부분이 흐리게 표시됩니다. OS / SDK가 제공하는 모든 것을 사용하여 재미있는 비즈니스 나 느린 코어 이미지 흐림 현상이 없습니다.
다음과 같이이보기 컨트롤러의보기를 다른보기에 추가 할 수 있습니다.
[self addChildViewController:self.blurViewController];
[self.view addSubview:self.blurViewController.view];
[self.blurViewController didMoveToParentViewController:self];
// animate the self.blurViewController into view
불분명 한 것이 있으면 알려주세요. 기꺼이 도와 드리겠습니다!
UIToolbar는 컬러 블러를 사용할 때 바람직하지 않은 효과를 제공하도록 7.0.3에서 변경되었습니다.
이전에는을 사용하여 색상을 설정할 수 barTintColor
있었지만 이전에이 작업을 수행 한 경우 알파 구성 요소를 1보다 작게 설정해야합니다. 그렇지 않으면 UIToolbar가 완전히 불투명 한 색상이됩니다.
이것은 다음과 같이 달성 될 수 있습니다 : (명심하는 self
것은의 하위 클래스입니다 UIToolbar
)
UIColor *color = [UIColor blueColor]; // for example
self.barTintColor = [color colorWithAlphaComponent:0.5];
흐릿한 시야에 파란 색조를 will니다.
self.backgroundColorView.opaque = NO;
self.backgroundColorView.alpha = 0.5;
self.backgroundColorView.backgroundColor = [UIColor colorWithWhite:0.3 alpha:1];
. 어쨌든 고마워!
CIGaussianBlur를 사용한 Swift의 빠른 구현은 다음과 같습니다.
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
과 같이 사용자 정의 설정을 사용해 볼 수 있습니다.
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)
}
}
(NSClassFromString("_UICustomVibrancyEffect") as! UIVibrancyEffect.Type).init()
정말로 도움을 주셔서 감사합니다!
UIViewPropertyAnimator를 사용하여 개인 API로 방해 하지 않고 사용자 정의 흐림 효과를 추가하는 쉬운 방법이 있습니다. .
먼저 클래스 속성을 선언하십시오.
var blurAnimator: UIViewPropertyAnimator!
그런 다음 흐림보기를 다음 위치에 설정하십시오 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.
참고 : 이 솔루션은 UICollectionView
/ UITableView
세포에 적합하지 않습니다
허용 된 답변은 정확하지만 배경을 흐리게하려는이보기가 다음을 사용하여 표시되는 경우 중요한 단계가 누락되었습니다.
[self presentViewController:vc animated:YES completion:nil]
기본적으로 UIKit은 발표자의 뷰를 제거하므로 블러를 무효화합니다. 이러한 제거를 피하려면이 줄을 이전 줄 앞에 추가하십시오.
vc.modalPresentationStyle = UIModalPresentationOverFullScreen;
또는 다른 Over
스타일을 사용하십시오 .
목표 -C
UIVisualEffect *blurEffect;
blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
UIVisualEffectView *visualEffectView;
visualEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
visualEffectView.frame = self.accessImageView.bounds;
[self.accessImageView addSubview:visualEffectView];
스위프트 3.0
let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.dark)
let blurEffectView = UIVisualEffectView(effect: blurEffect)
blurEffectView.frame = view.bounds
blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
view.addSubview(blurEffectView)
더 많은 제어를 원하는 사람들을 위해 Apple의 UIImageEffects
샘플 코드를 활용할 수 있습니다 .
UIImageEffects
Apple 개발자 라이브러리에서 코드를 복사 할 수 있습니다 : 이미지 흐리게 및 색조
#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
}
}
우연히 이것을 발견하고, Apple의 결과와 거의 비슷한 결과를 얻었으며 Acceleration 프레임 워크를 사용합니다. -http : //pastebin.com/6cs6hsyQ * 내가 작성하지 않았습니다
이 답변은 Mitja Semolic의 우수한 이전 답변을 기반으로 합니다. 나는 그것을 스위프트 3으로 변환하고, 코멘트에서 일어나는 일에 대한 설명을 추가하고, UIViewController의 확장을 만들었으므로 모든 VC가 자유로이 호출 할 수 있으며, 흐릿한보기를 추가하여 선택적 응용 프로그램을 표시하고 완료 블록을 추가했습니다. 호출 뷰 컨트롤러는 블러 완료시 원하는 모든 작업을 수행 할 수 있습니다.
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
}
}
iOS 10.3.1 및 iOS 11 모두에서 작동한다는 것을 확인했습니다.
@Joey의 답변에 대한 중요한 보충
이렇게하면 흐리게-배경 제시 할 상황에 적용 UIViewController
과를 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];
즐겨!
흐릿한 이미지를 반환하는 Kev의 Swift 3 버전 답변-
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;
}
다음은 놀라운 @AdamBardon 기술을 사용하는 더 자세한 예입니다.
@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
}
{제외 : 일반적인 iOS 엔지니어링 문제로서, didMoveToWindow
귀하보다 더 적합 할 수 있습니다.didMoveToSuperview
. 둘째, 다른 방법으로 분리를 수행 할 수 있지만 분리는 여기에 표시된 두 줄의 코드입니다.}
BlurryBall
그냥입니다 UIVisualEffectView
. 시각 효과보기의 초기화를 확인하십시오. 둥근 모서리 또는 무엇이든 필요한 경우이 수업에서하십시오.
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 + ImageEffects.h라는 UIImage 클래스의 확장 기능을 제공했습니다. 이 클래스에는 시야를 흐리게하기위한 원하는 메소드가 있습니다.
허용 된 답변 으로 제공된 솔루션의 Swift 2.0 코드는 다음과 같습니다 .
//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에 어두운 흐림보기를 추가하면 아름답게 만듭니다.
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
"흐림 효과가있는 시각 효과보기"및 "흐림 효과가있는 시각 효과보기"를 사용하여 배경을 흐리게 만들 수 있습니다.
iOS 응용 프로그램에서 배경 흐림을 만들기 위해해야 할 일은 ...
이것이 누군가를 도울 수 있도록 여기에 Jordan H의 답변을 바탕으로 만든 신속한 확장 기능이 있습니다. Swift 5로 작성되었으며 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
}
}
}
참고 : 텍스트에 영향을주지 않고 UILabel의 배경을 흐리게하려면 컨테이너 UIView를 만들고 UILabel을 컨테이너 UIView에 하위보기로 추가하고 UILabel의 backgroundColor를 UIColor.clear로 설정 한 다음 blurBackground (style을 호출해야합니다. : 컨테이너 UIView의 UIBlurEffect.Style, fallbackColor : UIColor) 다음은 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)
스위프트 4 :
오버레이 또는 팝업 뷰를 추가하려면 무료 View Controller가있는 컨테이너 뷰를 사용할 수도 있습니다 (일반 객체 팔레트 / 라이브러리에서 컨테이너 뷰를 가져옵니다).
단계 :
컨테이너 뷰의 내용이 표시 될 때이 컨테이너 뷰를 유지하는 뷰 (그림의 ViewForContainer)를 흐리게 표시하십시오. 첫 번째 View Controller 내부에 콘센트를 연결
첫 번째 VC가로드 될 때이 뷰 숨기기
버튼을 클릭하면 숨기기 해제 여기에 이미지 설명을 입력하십시오
컨테이너보기 내용이 표시 될 때이보기를 흐리게 표시하려면보기 배경을 검은 색으로, 불투명도를 30 %로 설정하십시오.
다른 Stackoverflow 질문 https://stackoverflow.com/a/49729431/5438240 에서 popview view 생성에 대한 답변을 추가했습니다.
간단한 대답은 하위보기를 추가하고 알파로 변경하는 것입니다.
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];