Chcę zanikać UIVisualEffectsView za pomocą UIBlurEffect in and out:
var blurEffectView = UIVisualEffectView()
blurEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .dark))
Używam normalnej animacji w funkcji wywoływanej przez a, UIButton
aby ją wprowadzić, tak samo jak przy zanikaniu, ale .alpha = 0
& hidden = true
:
blurEffectView.hidden = false
UIView.animate(withDuration: 1, delay: 0, options: .curveEaseOut) {
self.blurEffectView.alpha = 1
}
Teraz blaknięcie w obu kierunkach działa, ale daje mi błąd podczas blaknięcie się :
<UIVisualEffectView 0x7fdf5bcb6e80>
jest proszony o animację jego krycia. Spowoduje to, że efekt będzie wyglądał na uszkodzony, dopóki krycie nie powróci do 1.
Pytanie
Jak z powodzeniem wprowadzać UIVisualEffectView
i wyłączać wejście bez przerywania go i zanikania przejścia?
Uwaga
- Próbowałem wstawić
UIVisualEffectView
aUIView
i zniknąć, bez powodzenia
ios
swift
fade
uiblureffect
uivisualeffectview
LinusGeffarth
źródło
źródło
Odpowiedzi:
Myślę, że to nowość w iOS9, ale możesz teraz ustawić efekt
UIVisualEffectView
wewnątrz bloku animacji:let overlay = UIVisualEffectView() // Put it somewhere, give it a frame... UIView.animate(withDuration: 0.5) { overlay.effect = UIBlurEffect(style: .light) }
Ustaw go,
nil
aby usunąć.BARDZO WAŻNE - Podczas testowania tego na symulatorze, upewnij się, że ustawiłeś nadpisanie jakości grafiki w symulatorze na wysoką jakość, aby to zadziałało.
źródło
Dokumentacja Apple (obecnie) stwierdza ...
i
Uważam, że brakuje tu jakiegoś ważnego kontekstu ...
Sugerowałbym, aby celem było unikanie wartości alfa, które są mniejsze niż 1 dla trwałego widoku. Moim skromnym zdaniem nie dotyczy to animacji widoku.
Moja uwaga - sugerowałbym, że wartości alfa mniejsze niż 1 są dopuszczalne dla animacji.
Komunikat terminala stwierdza:
Czytając to uważnie, efekt wydaje się zepsuty. Moje uwagi na ten temat:
UIVisualEffect
widok z wartością alfa mniejszą niż 1 nie będzie się prezentował zgodnie z zamierzeniami / projektami Apple; iAby rozszerzyć powyższą odpowiedź @ jrturton, która pomogła mi rozwiązać problem, dodam ...
Aby zaniknąć
UIVisualEffect
użyj następującego kodu (celu-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() } )
Z powodzeniem używam obu metod: ustawiając
effect
właściwość nanil
i ustawiającalpha
właściwość na0
.Należy pamiętać, że ustawienie
effect
sięnil
tworzy „piękny błysk” (z braku lepszego opisu) na końcu animacji, natomiast ustawieniealpha
na0
tworzy płynne przejście.(Daj mi znać o wszelkich błędach składniowych ... Piszę w obj-c.)
źródło
Oto rozwiązanie, które skończyłem, które działa zarówno na iOS10, jak i wcześniejszych wersjach przy użyciu Swift 3
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 } } } }
Możesz również sprawdzić tę treść, aby znaleźć przykładowe użycie.
źródło
UIViewPropertyAnimator
Wydaje się, że jedyną rzeczą, która działa w iOS 11, jest używanie programu . Dzięki za to!Tylko obejście - umieść
UIVisualEffectView
w widoku kontenera i zmieńalpha
właściwość dla tego kontenera. To podejście działa idealnie dla mnie na iOS 9. Wygląda na to, że nie działa już w iOS 10.źródło
Możesz bez problemu zmienić alfa widoku efektów wizualnych poza ostrzeżeniem w konsoli. Widok może wydawać się po prostu częściowo przezroczysty, a nie zamazany. Ale zwykle nie stanowi to problemu, jeśli zmieniasz alfa podczas animacji.
Twoja aplikacja nie ulegnie awarii ani nie zostanie z tego powodu odrzucona. Przetestuj na prawdziwym urządzeniu (lub ośmiu). Jeśli jesteś zadowolony z tego, jak wygląda i działa, jest w porządku. Apple ostrzega tylko, że może nie wyglądać lub działać tak dobrze, jak widok efektów wizualnych z wartością alfa 1.
źródło
Możesz zrobić migawkę statycznego widoku znajdującego się pod spodem i zanikać go bez dotykania krycia widoku rozmycia. Zakładając blask blurView:
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() } ) }
źródło
Jeśli chcesz zaniknąć w Tobie UIVisualEffectView - dla iOS10 użyj 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]]; }];
wtedy możesz ustawić procent
dla ios9 możesz użyć komponentu alfa
źródło
Alfa UIVisualEffectView zawsze musi wynosić 1. Myślę, że można osiągnąć ten efekt, ustawiając alfa koloru tła.
Źródło: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIVisualEffectView/index.html
źródło
colorWithAlphaComponent:
metody wUIColor
instancjach. Nie wiem jednak, jak osiągnąć ten sam efekt, ustawiając kolor tła.Robię uiview, którego alfa wynosi 0 i dodaję blurview jako subview tego. Więc mogę ukryć / pokazać lub zaokrąglić rogi za pomocą animacji.
źródło
Skończyło się na następującym rozwiązaniu, używając osobnych animacji dla
UIVisualEffectView
treści i. Użyłem tejviewWithTag()
metody, aby uzyskać odniesienie doUIView
wnętrzaUIVisualEffectView
.let blurEffectView = UIVisualEffectView() // Fade in UIView.animateWithDuration(1) { self.blurEffectView.effect = UIBlurEffect(style: .Light) } UIView.animateWithDuration(1) { self.blurEffectView.viewWithTag(1)?.alpha = 1 } // Fade out UIView.animateWithDuration(1) { self.blurEffectView.effect = nil } UIView.animateWithDuration(1) { self.blurEffectView.viewWithTag(1)?.alpha = 0 }
Wolałbym pojedynczą animację zmieniającą alfa, ale to pozwala uniknąć błędu i wydaje się działać równie dobrze.
źródło
Właśnie miałem ten problem i sposób, w jaki go obejść, polegał na umieszczeniu UIVisualEffectsView w UIView i animacji alfa UIView.
To działało dobrze, z wyjątkiem tego, że gdy tylko wartość alfa zmieniła się poniżej 1,0, zmieniła się w jednolitą biel i wyglądała bardzo drażniąco. Aby to obejść, musisz ustawić właściwość warstwy UIView,
containerView.layer.allowsGroupOpacity = false
co zapobiegnie miganiu na biało.Teraz możesz animować / zanikać UIView zawierający widok efektów wizualnych i wszelkie inne podwidoki przy użyciu jego właściwości alfa i nie musisz się martwić o żadne błędy graficzne lub rejestrowanie komunikatu ostrzegawczego.
źródło
_visualEffectView.contentView.alpha = 0;
Aby zmienić alfa UIVisualEffectView, należy zmienić contentView w _visualEffectView. Jeśli zmienisz alfa w _visualEffectView, otrzymasz to
<UIVisualEffectView 0x7ff7bb54b490> is being asked to animate its opacity. This will cause the effect to appear broken until opacity returns to 1.
źródło
Zwykle chcę animować rozmycie tylko wtedy, gdy przedstawiam kontroler widoku na ekranie i chcę rozmazać kontroler widoku prezentacji. Oto rozszerzenie, które dodaje blur () i unblur () do kontrolera widoku, aby to ułatwić:
extension UIViewController { func blur() { // Blur out the current view let blurView = UIVisualEffectView(frame: self.view.frame) self.view.addSubview(blurView) UIView.animate(withDuration:0.25) { blurView.effect = UIBlurEffect(style: .light) } } func unblur() { for childView in view.subviews { guard let effectView = childView as? UIVisualEffectView else { continue } UIView.animate(withDuration: 0.25, animations: { effectView.effect = nil }) { didFinish in effectView.removeFromSuperview() } } } }
Możesz oczywiście uczynić to bardziej solidnym, pozwalając użytkownikowi wybrać styl efektu, zmodyfikować czas trwania, wywołać coś po zakończeniu animacji, oznaczyć dodany widok efektu wizualnego w rozmyciu (), aby upewnić się, że jest to jedyny usuwany po odblokowaniu ( ) itp., ale jak dotąd nie znalazłem potrzeby robienia tych rzeczy, ponieważ jest to zwykle operacja typu „odpal i zapomnij”.
źródło
na podstawie odpowiedzi @ cc zmodyfikowałem jego rozszerzenie, aby zamazać widok
źródło
Poprawiając odpowiedź @ Tel4tel i @cc, oto rozszerzenie z parametrami i krótkim wyjaśnieniem.
extension UIView { // Perform a blur animation in the whole view // Effect tone can be .light, .dark, .regular... func blur(duration inSeconds: Double, effect tone: UIBlurEffectStyle) { let blurView = UIVisualEffectView(frame: self.bounds) self.addSubview(blurView) UIView.animate(withDuration: inSeconds) { blurView.effect = UIBlurEffect(style: tone) } } // Perform an unblur animation in the whole view func unblur(duration inSeconds: Double) { for childView in subviews { guard let effectView = childView as? UIVisualEffectView else { continue } UIView.animate(withDuration: inSeconds, animations: { effectView.effect = nil }){ didFinish in effectView.removeFromSuperview() } } } }
Następnie możesz go użyć w ten sposób:
view.blur(duration: 5.0, effect: .light)
lubview.unblur(duration: 3.0)
Pamiętaj, aby NIE używać go w,
viewDidLoad()
ponieważ nadpisuje animację. Ponadto, podczas uruchamiania w symulatorze, przełącz grafikę na wyższy poziom, aby móc zobaczyć animację (Debugowanie> Nadpisanie jakości grafiki> Wysoka jakość).źródło