Ich versuche, diesen unscharfen Hintergrund von Apples öffentlich veröffentlichtem iOS 7-Beispielbildschirm zu replizieren:
Diese Frage schlägt vor, einen CI-Filter auf die folgenden Inhalte anzuwenden, aber das ist ein ganz anderer Ansatz. Es ist offensichtlich, dass iOS 7 aus vielen Gründen den Inhalt der folgenden Ansichten nicht erfasst:
- Das Durchführen einiger grober Tests, das Aufnehmen eines Screenshots der folgenden Ansichten und das Anwenden eines CIGaussianBlur-Filters mit einem Radius, der groß genug ist, um den Unschärfestil von iOS 7 nachzuahmen, dauert selbst auf einem Simulator 1-2 Sekunden.
- Die Unschärfeansicht für iOS 7 kann dynamische Ansichten wie Videos oder Animationen ohne merkliche Verzögerung verwischen.
Kann jemand eine Hypothese aufstellen, mit welchen Frameworks er diesen Effekt erzeugen könnte und ob es möglich ist, mit aktuellen öffentlichen APIs einen ähnlichen Effekt zu erzielen?
Bearbeiten: (aus dem Kommentar) Wir wissen nicht genau, wie Apple es macht, aber gibt es grundlegende Annahmen, die wir treffen können? Wir können davon ausgehen, dass sie Hardware verwenden, oder?
Ist der Effekt in jeder Ansicht in sich geschlossen, sodass der Effekt nicht genau weiß, was dahinter steckt? Oder muss, basierend auf der Funktionsweise von Unschärfen, der Inhalt hinter der Unschärfe berücksichtigt werden?
Wenn die Inhalte hinter dem Effekt relevant sind, können wir davon ausgehen, dass Apple einen "Feed" der folgenden Inhalte empfängt und diese kontinuierlich verwischt?
quelle
Antworten:
Warum sollte man sich die Mühe machen, den Effekt zu wiederholen? Zeichnen Sie einfach eine UIToolbar hinter Ihre Ansicht.
quelle
frame
odertransform
dieser Symbolleiste / Ansicht oder ähnliches zu machen, sonst würden schlimme Dinge passieren. Er schlug außerdem dringend vor, Radar-Fehlerberichte zu diesem Thema einzureichen, um intern einen Fall zu erstellen, damit wir eine echte öffentliche API für diesen Effekt erhalten können!UITabBar
.Apple hat auf der WWDC Code als Kategorie auf UIImage veröffentlicht, der diese Funktionalität enthält. Wenn Sie über ein Entwicklerkonto verfügen, können Sie die UIImage-Kategorie (und den Rest des Beispielcodes) über diesen Link abrufen: https://developer.apple. com / wwdc / Schedule / und suchen Sie nach Abschnitt 226 und klicken Sie auf Details. Ich habe noch nicht damit herumgespielt, aber ich denke, dass der Effekt unter iOS 6 viel langsamer sein wird. Es gibt einige Verbesserungen an iOS 7, die das Abrufen des ersten Screenshots, der als Eingabe für die Unschärfe verwendet wird, viel schneller machen.
Direkter Link: https://developer.apple.com/downloads/download.action?path=wwdc_2013/wwdc_2013_sample_code/ios_uiimageeffects.zip
quelle
Eigentlich würde ich wetten, dass dies ziemlich einfach zu erreichen wäre. Es würde wahrscheinlich nicht genau so funktionieren oder aussehen wie Apple, könnte aber sehr nahe sein.
Zunächst müssen Sie den CGRect der UIView bestimmen, die Sie präsentieren möchten. Sobald Sie festgestellt haben, dass Sie nur ein Bild des Teils der Benutzeroberfläche aufnehmen müssen, damit es unscharf wird. Etwas wie das...
Gaußsche Unschärfe - Empfohlen
Wenn Sie die hier
UIImage+ImageEffects
bereitgestellte Kategorie Apple verwenden , erhalten Sie eine Gaußsche Unschärfe, die der Unschärfe in iOS 7 sehr ähnlich sieht.Box Unschärfe
Sie können auch eine Box-Unschärfe mit der folgenden
boxBlurImageWithBlur:
UIImage-Kategorie verwenden. Dies basiert auf einem Algorithmus, den Sie hier finden können .Nachdem Sie den zu verwischenden Bildschirmbereich berechnet, ihn in die Kategorie "Unschärfe" übergeben und ein unscharfes UII-Bild zurückerhalten, müssen Sie nur noch das unscharfe Bild als Hintergrund für die Ansicht festlegen, die Sie präsentieren möchten. Wie ich bereits sagte, wird dies nicht perfekt zu dem passen, was Apple tut, aber es sollte trotzdem ziemlich cool aussehen.
Ich hoffe es hilft.
quelle
renderInContext
, verwenden Sie das neuedrawViewHierarchyInRect:
odersnapshotView:
. WWDC-Vortrag 216 "Implementieren der Benutzeroberfläche auf iOS7" behauptet eine 5-15-fache Leistungsverbesserung.iOS8 hat diese Fragen beantwortet.
- (instancetype)initWithEffect:(UIVisualEffect *)effect
oder Swift:
init(effect effect: UIVisualEffect)
quelle
Ich habe gerade meine kleine Unterklasse von UIView geschrieben, die in jeder benutzerdefinierten Ansicht native iOS 7-Unschärfe erzeugen kann. Es verwendet die UIToolbar, aber auf sichere Weise, um Rahmen, Grenzen, Farbe und Alpha mit Echtzeitanimation zu ändern.
Bitte lassen Sie mich wissen, wenn Sie Probleme bemerken.
https://github.com/ivoleko/ILTranslucentView
quelle
Es gibt ein Gerücht, dass Apple-Ingenieure behaupteten, sie würden direkt aus dem GPU-Puffer lesen, um diese Leistung zu erbringen, was Sicherheitsprobleme aufwirft, weshalb es noch keine öffentliche API gibt, um dies zu tun.
quelle
Dies ist eine Lösung, die Sie in den Videos des WWDC sehen können. Sie müssen eine Gaußsche Unschärfe ausführen. Als Erstes müssen Sie eine neue .m- und .h-Datei mit dem Code hinzufügen, den ich hier schreibe. Anschließend müssen Sie einen Screenshot erstellen, den gewünschten Effekt verwenden und Fügen Sie es Ihrer Ansicht hinzu, dann Ihre UITable UIView oder was auch immer transparent sein muss, Sie können mit applyBlurWithRadius spielen, um den gewünschten Effekt zu archivieren. Dieser Aufruf funktioniert mit jedem UIImage.
Am Ende ist das unscharfe Bild der Hintergrund und die restlichen Steuerelemente oben müssen transparent sein.
Damit dies funktioniert, müssen Sie die nächsten Bibliotheken hinzufügen:
Acelerate.framework, UIKit.framework, CoreGraphics.framework
Ich hoffe du magst es.
Viel Spaß beim Codieren.
quelle
Sie finden Ihre Lösung von Apple DEMO auf dieser Seite: WWDC 2013 Apples , finden Sie den UIImageEffects-Beispielcode heraus und laden Sie ihn herunter.
Dann mit dem Code von @Jeremy Fox. Ich habe es geändert in
Hoffe das wird dir helfen.
quelle
Hier ist eine wirklich einfache Möglichkeit: https://github.com/JagCesar/iOS-blur
Kopieren Sie einfach die Ebene der UIToolbar und fertig, AMBlurView erledigt das für Sie. Okay, es ist nicht so verschwommen wie das Kontrollzentrum, aber es ist verschwommen genug.
Denken Sie daran, dass iOS7 unter NDA steht.quelle
Jede Antwort hier verwendet vImageBoxConvolve_ARGB8888 Diese Funktion ist sehr, sehr langsam. Das ist in Ordnung, wenn die Leistung keine hohe Priorität hat. Wenn Sie diese Funktion jedoch für den Übergang zwischen zwei View Controllern verwenden (z. B.), bedeutet dieser Ansatz Zeiten über 1 Zweitens oder vielleicht mehr, das ist sehr schlecht für die Benutzererfahrung Ihrer Anwendung.
Wenn Sie es vorziehen, die gesamte Bildverarbeitung der GPU zu überlassen (und Sie sollten es tun), können Sie einen viel besseren Effekt erzielen und auch fantastische Zeiten um 50 ms erzielen (vorausgesetzt, Sie haben beim ersten Ansatz eine Zeit von 1 Sekunde) .
Laden Sie zuerst das GPUImage Framework (BSD Licensed) hier herunter .
Fügen Sie als Nächstes die folgenden Klassen (.m und .h) aus dem GPUImage hinzu (ich bin nicht sicher, ob dies das Minimum ist, das nur für den Unschärfeeffekt benötigt wird).
GPUImageTwoPassTextureSamplingFilter
iOS / GPUImage-Prefix.pch
Erstellen Sie als Nächstes eine Kategorie in UIImage, die einem vorhandenen UIImage einen Unschärfeeffekt hinzufügt:
Fügen Sie Ihrem Projekt zuletzt die folgenden Frameworks hinzu:
AVFoundation CoreMedia CoreVideo OpenGLES
Ja, ich habe Spaß mit diesem viel schnelleren Ansatz gehabt;)
quelle
Sie können versuchen, meine benutzerdefinierte Ansicht zu verwenden, mit der der Hintergrund verwischt werden kann. Dazu wird ein Schnappschuss des Hintergrunds vorgetäuscht und verwischt, genau wie im WWDC-Code von Apple. Es ist sehr einfach zu bedienen.
Ich habe auch einige Verbesserungen vorgenommen, um die dynamische Unschärfe vorzutäuschen, ohne die Leistung zu verlieren. Der Hintergrund meiner Ansicht ist eine scrollView, die mit der Ansicht scrollt und somit den Unschärfeeffekt für den Rest der Übersicht liefert.
Siehe das Beispiel und den Code auf meinem GitHub
quelle
Core Background implementiert den gewünschten iOS 7-Effekt.
https://github.com/justinmfischer/core-background
Haftungsausschluss: Ich bin der Autor dieses Projekts
quelle