Ich möchte eine UIVisualEffectsView mit einem UIBlurEffect ein- und ausblenden:
var blurEffectView = UIVisualEffectView()
blurEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .dark))
Ich verwende eine normale Animation innerhalb einer Funktion, die von a aufgerufen wird UIButton
, um sie einzublenden. Gleiches gilt für das Ausblenden, aber .alpha = 0
& hidden = true
:
blurEffectView.hidden = false
UIView.animate(withDuration: 1, delay: 0, options: .curveEaseOut) {
self.blurEffectView.alpha = 1
}
Nun, in beiden Richtungen Verblassen funktioniert , aber es gibt mir einen Fehler , wenn Schwund aus :
<UIVisualEffectView 0x7fdf5bcb6e80>
wird gebeten, seine Opazität zu animieren. Dadurch wird der Effekt unterbrochen, bis die Deckkraft auf 1 zurückkehrt.
Frage
Wie kann ich das Ein- UIVisualEffectView
und Ausblenden erfolgreich einblenden , ohne es zu unterbrechen und einen verblassenden Übergang zu haben?
Hinweis
- Ich habe versucht, das
UIVisualEffectView
in ein zu setzenUIView
und dieses zu verblassen, kein Erfolg
ios
swift
fade
uiblureffect
uivisualeffectview
LinusGeffarth
quelle
quelle
Antworten:
Ich denke, dies ist neu in iOS9, aber Sie können jetzt den Effekt eines
UIVisualEffectView
innerhalb eines Animationsblocks einstellen :Stellen Sie es auf
nil
zu entfernen.SEHR WICHTIG - Wenn Sie dies auf dem Simulator testen, stellen Sie sicher, dass die Überschreibung der Grafikqualität Ihres Simulators auf Hohe Qualität eingestellt ist, damit dies funktioniert.
quelle
In der Apple-Dokumentation heißt es (derzeit) ...
und
Ich glaube, hier fehlt ein wichtiger Kontext ...
Ich würde vorschlagen, dass die Absicht darin besteht, Alpha-Werte zu vermeiden, die für eine dauerhafte Ansicht kleiner als 1 sind. Meiner bescheidenen Meinung nach gilt dies nicht für die Animation einer Ansicht.
Mein Punkt - Ich würde vorschlagen, dass Alpha-Werte unter 1 für Animationen akzeptabel sind.
Die Terminalnachricht lautet:
Wenn Sie dies sorgfältig lesen, scheint der Effekt unterbrochen zu sein. Meine Punkte zu diesem Wesen:
UIVisualEffect
Ansicht mit einem Alpha-Wert von weniger als 1 wird nicht wie von Apple beabsichtigt / entworfen angezeigt. undUm die Antwort von @ jrturton oben zu erweitern, die mir bei der Lösung meines Problems geholfen hat, würde ich hinzufügen ...
UIVisualEffect
Verwenden Sie zum Ausblenden den folgenden Code (Objective-C):Ich verwende erfolgreich beide Methoden: Setzen der
effect
Eigenschaft aufnil
und Setzen deralpha
Eigenschaft auf0
.Beachten Sie, dass durch Setzen von
effect
tonil
am Ende der Animation ein "schöner Blitz" (aus Mangel an einer besseren Beschreibung) erzeugt wird , während durch Setzen vonalpha
to0
ein reibungsloser Übergang erzeugt wird.(Lassen Sie mich alle Syntaxfehler wissen ... Ich schreibe in obj-c.)
quelle
Hier ist die Lösung, die ich gefunden habe und die sowohl auf iOS10 als auch auf früheren Versionen mit Swift 3 funktioniert
Sie können diese Übersicht auch überprüfen , um ein Beispiel für eine Verwendung zu finden.
quelle
UIViewPropertyAnimator
ist das einzige, was in iOS 11 zu funktionieren scheint. Danke dafür!Nur eine Problemumgehung -
UIVisualEffectView
in eine Containeransicht einfügen und diealpha
Eigenschaft für diesen Container ändern . Dieser Ansatz funktioniert perfekt für mich unter iOS 9. Scheint unter iOS 10 nicht mehr zu funktionieren.quelle
Sie können das Alpha der visuellen Effektansicht ohne Probleme ändern, abgesehen von der Warnung in der Konsole. Die Ansicht kann einfach als teilweise transparent und nicht als unscharf erscheinen. Dies ist jedoch normalerweise kein Problem, wenn Sie nur das Alpha während der Animation ändern.
Ihre App wird nicht abstürzen oder dafür abgelehnt. Testen Sie es auf einem realen Gerät (oder acht). Wenn Sie mit dem Aussehen und der Leistung zufrieden sind, ist es in Ordnung. Apple warnt Sie nur davor, dass es möglicherweise nicht so gut aussieht oder funktioniert wie eine visuelle Effektansicht mit einem Alpha-Wert von 1.
quelle
Sie können einen Schnappschuss einer statischen zugrunde liegenden Ansicht erstellen und ein- und ausblenden, ohne die Deckkraft der Unschärfeansicht zu berühren. Angenommen, ein Ivar von blurView:
quelle
Wenn Sie UIVisualEffectView einblenden möchten, verwenden Sie für ios10 UIViewPropertyAnimator
dann können Sie Prozent einstellen
Für ios9 können Sie die Alpha-Komponente verwenden
quelle
Das Alpha von UIVisualEffectView muss immer 1 sein. Ich denke, Sie können den Effekt erzielen, indem Sie das Alpha der Hintergrundfarbe einstellen.
Quelle: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIVisualEffectView/index.html
quelle
colorWithAlphaComponent:
Methode für dieUIColor
Instanzen. Ich bin mir jedoch nicht sicher, wie ich den gleichen Effekt beim Einstellen der Hintergrundfarbe erzielen kann.Ich mache eine Uiview, deren Alpha 0 ist, und füge Unschärfe als Unteransicht davon hinzu. So kann ich es mit Animation ausblenden / einblenden oder abrunden.
quelle
Am Ende hatte ich die folgende Lösung, bei der separate Animationen für den
UIVisualEffectView
und den Inhalt verwendet wurden. Ich habe dieviewWithTag()
Methode verwendet, um einen Verweis auf dasUIView
Innere des zu erhaltenUIVisualEffectView
.Ich würde es vorziehen, wenn die einzelne Animation das Alpha ändert, aber dies vermeidet den Fehler und scheint genauso gut zu funktionieren.
quelle
Ich hatte gerade dieses Problem und die Art und Weise, wie ich es umgehen konnte, bestand darin, die UIVisualEffectsView in einer UIView unterzubringen und das Alpha der UIView zu animieren.
Dies funktionierte gut, außer dass es, sobald sich das Alpha unter 1,0 änderte, zu einem festen Weiß wurde und sehr irritierend aussah. Um dies zu umgehen, müssen Sie die Layereigenschaft von UIView festlegen. Dadurch
containerView.layer.allowsGroupOpacity = false
wird verhindert, dass sie weiß blinkt.Jetzt können Sie die UIView mit der visuellen Effektansicht und allen anderen Unteransichten mithilfe ihrer Alpha-Eigenschaft animieren / ausblenden und müssen sich keine Gedanken über grafische Störungen machen oder eine Warnmeldung protokollieren.
quelle
Um das Alpha von UIVisualEffectView zu ändern, sollten Sie die contentView von _visualEffectView ändern. Wenn Sie das Alpha von _visualEffectView ändern, erhalten Sie dies
quelle
Normalerweise möchte ich eine Unschärfe nur animieren, wenn ich einen Ansichts-Controller über dem Bildschirm präsentiere und den präsentierenden Ansichts-Controller verwischen möchte. Hier ist eine Erweiterung, die einem Ansichts-Controller blur () und unblur () hinzufügt, um dies zu vereinfachen:
Sie können dies natürlich robuster machen, indem Sie den Benutzer den Effektstil auswählen lassen, die Dauer ändern, nach Abschluss der Animation etwas aufrufen und die hinzugefügte visuelle Effektansicht in blur () markieren, um sicherzustellen, dass sie die einzige ist, die beim Aufheben der Unschärfe entfernt wird ( ) usw., aber ich habe bisher nicht die Notwendigkeit gefunden, diese Dinge zu tun, da dies in der Regel eine Art "Feuer und Vergessen" -Operation ist.
quelle
Basierend auf der Antwort von @ cc habe ich seine Erweiterung geändert, um eine Ansicht zu verwischen
quelle
Hier finden Sie eine Erweiterung mit Parametern und eine kurze Erklärung zur Verbesserung der @ Tel4tel- und @cc-Antwort.
Dann können Sie es verwenden wie:
view.blur(duration: 5.0, effect: .light)
oderview.unblur(duration: 3.0)
Denken Sie daran, es NICHT zu verwenden,
viewDidLoad()
da es die Animation überschreibt. Wenn Sie auf einem Simulator ausgeführt werden, drehen Sie die Grafiken auf die höhere Ebene, um die Animation anzuzeigen (Debug> Überschreiben der Grafikqualität> Hohe Qualität).quelle