UIBlurEffect를 사용하여 UIVisualEffectsView를 페이드 인 및 아웃하고 싶습니다.
var blurEffectView = UIVisualEffectView()
blurEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .dark))
나는 UIButton
그것을 페이드 인하 기 위해 호출하는 함수 내에서 일반 애니메이션을 사용하고 페이드 아웃과 동일하지만 .alpha = 0
& hidden = true
:
blurEffectView.hidden = false
UIView.animate(withDuration: 1, delay: 0, options: .curveEaseOut) {
self.blurEffectView.alpha = 1
}
이제 양방향으로 페이드가 작동하지만 페이드 아웃 할 때 오류가 발생 합니다 .
<UIVisualEffectView 0x7fdf5bcb6e80>
불투명도에 애니메이션을 적용하라는 요청을 받고 있습니다. 이렇게하면 불투명도가 1이 될 때까지 효과가 깨져 보입니다.
질문
어떻게 성공적으로 페이드 할 수 UIVisualEffectView
없이 들락날락 위반 을하고 페이딩 전환을 가지고?
노트
- 나는 그것을
UIVisualEffectView
안으로 넣고 그것을UIView
페이드 하려고 노력했지만 , 성공하지 못했다.
답변
나는 이것이 iOS9에서 새로운 것이라고 생각하지만 이제 UIVisualEffectView
애니메이션 블록 내부 의 효과를 설정할 수 있습니다 .
let overlay = UIVisualEffectView()
// Put it somewhere, give it a frame...
UIView.animate(withDuration: 0.5) {
overlay.effect = UIBlurEffect(style: .light)
}
nil
제거 하려면 로 설정 하십시오.
매우 중요-시뮬레이터에서 이것을 테스트 할 때 이것이 작동하도록 시뮬레이터의 그래픽 품질 재정의를 고품질로 설정해야합니다.
답변
애플 문서는 (현재) 상태 …
UIVisualEffectView 클래스를 사용하는 경우 1보다 작은 알파 값을 사용하지 마십시오.
과
시각적 효과보기 또는 수퍼 뷰에서 알파를 1 미만으로 설정하면 많은 효과가 잘못 보이거나 전혀 표시되지 않습니다.
여기에 몇 가지 중요한 맥락이 누락되었다고 생각합니다 …
영구 뷰를 위해 1보다 작은 알파 값을 피하는 것이 목적이라고 제안합니다. 내 겸손한 의견으로는 이것은 뷰의 애니메이션에는 적용되지 않습니다.
내 요점은 1보다 작은 알파 값이 애니메이션에 허용된다는 점입니다.
터미널 메시지에 다음과 같이 표시됩니다.
UIVisualEffectView는 불투명도를 애니메이션하도록 요청됩니다. 이렇게하면 불투명도가 1이 될 때까지 효과가 깨져 보입니다.
이것을주의 깊게 읽으면 효과가 깨지는 것처럼 보일 것 입니다. 이것에 대한 나의 요점 :
- 명백한 단절은 변하지 않는 지속적인 뷰에만 정말로 중요합니다.
- 지속적 / 변함없는
UIVisualEffect
알파 값이 1 미만인 보기는 Apple이 의도 한 / 설계 한대로 표시되지 않습니다. 과 - 터미널의 메시지는 오류가 아니라 경고 일뿐입니다.
내 문제를 해결하는 데 도움이 된 @jrturton의 답변을 확장하려면 …
페이드 아웃하려면 UIVisualEffect
다음 (Objective-C) 코드를 사용하십시오.
UIView.animateWithDuration(1.0, animations: {
// EITHER...
self.blurEffectView.effect = UIBlurEffect(nil)
// OR...
self.blurEffectView.alpha = 0
}, completion: { (finished: Bool) -> Void in
self.blurEffectView.removeFromSuperview()
} )
두 가지 방법을 모두 성공적으로 사용합니다. effect
속성 nil
설정 및 alpha
속성 설정0
.
로 설정하면 애니메이션 끝에 “멋진 플래시”(더 나은 설명을 원 effect
하기 위해) nil
가 생성 alpha
되고0
원활한 전환을 만듭니다.
(구문 오류가 있으면 알려주세요 … obj-c로 작성합니다.)
답변
다음은 Swift 3을 사용하여 iOS10 및 이전 버전 모두에서 작동하는 솔루션입니다.
extension UIVisualEffectView {
func fadeInEffect(_ style:UIBlurEffectStyle = .light, withDuration duration: TimeInterval = 1.0) {
if #available(iOS 10.0, *) {
let animator = UIViewPropertyAnimator(duration: duration, curve: .easeIn) {
self.effect = UIBlurEffect(style: style)
}
animator.startAnimation()
}else {
// Fallback on earlier versions
UIView.animate(withDuration: duration) {
self.effect = UIBlurEffect(style: style)
}
}
}
func fadeOutEffect(withDuration duration: TimeInterval = 1.0) {
if #available(iOS 10.0, *) {
let animator = UIViewPropertyAnimator(duration: duration, curve: .linear) {
self.effect = nil
}
animator.startAnimation()
animator.fractionComplete = 1
}else {
// Fallback on earlier versions
UIView.animate(withDuration: duration) {
self.effect = nil
}
}
}
}
답변
해결 방법- UIVisualEffectView
컨테이너보기에 넣고 alpha
해당 컨테이너의 속성을 변경 합니다. 이 접근 방식은 iOS 9에서 완벽하게 작동합니다. iOS 10에서는 더 이상 작동하지 않는 것 같습니다.
답변
콘솔의 경고 외에 문제없이 시각 효과보기의 알파를 변경할 수 있습니다. 보기가 흐릿하지 않고 부분적으로 투명하게 나타날 수 있습니다. 그러나 애니메이션 중에 알파 만 변경하는 경우 일반적으로 문제가되지 않습니다.
이로 인해 앱이 충돌하거나 거부되지 않습니다. 실제 장치 (또는 8 개)에서 테스트하십시오. 외관과 성능에 만족한다면 괜찮습니다. Apple은 알파 값이 1 인 시각 효과보기만큼 보이거나 작동하지 않을 수 있다고 경고했습니다.
답변
정적 기본 뷰의 스냅 샷을 찍고 블러 뷰의 불투명도를 건드리지 않고 페이드 인 및 페이드 아웃 할 수 있습니다. blurView의 ivar 가정 :
func addBlur() {
guard let blurEffectView = blurEffectView else { return }
//snapShot = UIScreen.mainScreen().snapshotViewAfterScreenUpdates(false)
let snapShot = self.view.snapshotViewAfterScreenUpdates(false)
view.addSubview(blurEffectView)
view.addSubview(snapShot)
UIView.animateWithDuration(0.25, animations: {
snapShot.alpha = 0.0
}, completion: { (finished: Bool) -> Void in
snapShot.removeFromSuperview()
} )
}
func removeBlur() {
guard let blurEffectView = blurEffectView else { return }
let snapShot = self.view.snapshotViewAfterScreenUpdates(false)
snapShot.alpha = 0.0
view.addSubview(snapShot)
UIView.animateWithDuration(0.25, animations: {
snapShot.alpha = 1.0
}, completion: { (finished: Bool) -> Void in
blurEffectView.removeFromSuperview()
snapShot.removeFromSuperview()
} )
}
답변
UIVisualEffectView를 페이드 인하려면-ios10의 경우 UIViewPropertyAnimator를 사용하십시오.
UIVisualEffectView *blurEffectView = [[UIVisualEffectView alloc] initWithEffect:nil];
blurEffectView.frame = self.view.frame;
blurEffectView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
UIView *blackUIView = [[UIView alloc]initWithFrame:self.view.frame];
[bacgroundImageView addSubview:blackUIView];
[blackUIView addSubview:blurEffectView];
UIViewPropertyAnimator *animator = [[UIViewPropertyAnimator alloc] initWithDuration:4.f curve:UIViewAnimationCurveLinear animations:^{
[blurEffectView setEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleDark]];
}];
그런 다음 백분율을 설정할 수 있습니다
[animator setFractionComplete:percent];
ios9의 경우 알파 구성 요소를 사용할 수 있습니다.