2012-07-22 4 views
33

Ich versuche, einen Milchglaseffekt in einem UIImageView anzuwenden.iPhone SDK - Mattglas (iOS 7 Weichzeichnen) Effekt

Ich versuchte zu implementieren, was ich in this question gefunden habe, aber das Ergebnis war nicht akzeptabel. ich so etwas wie dies wollte:

Frosted Glass Effect

Irgendwelche Ideen?

UPDATE:

Auch können wir sehen, dass iOS 7 verwendet diese Art von Wirkung in vielen Orten. Wie können wir es reproduzieren?

+0

Hier Lösung mit UIToolbar: http://stackoverflow.com/a/19506076/774394 –

+0

Ich erwähnte etwas ähnliches in Edit 2 - es macht Gebrauch von einem UIToolbar auch –

+0

Ja, Sie haben Recht. Diese Lösung funktioniert jedoch bei der Animation von Rahmen/Grenzen mit UIView-Animationen. –

Antwort

51

Ein gutes Tutorial über Coreimage ist hier, das zeigt, wie Filter anzuwenden und mehr:

http://www.raywenderlich.com/5689/beginning-core-image-in-ios-5

UPDATE 1

So nach ein wenig Forschung, landete ich die Entdeckung auf, dass Das Core Image für iOS ist im Vergleich zur OS X-Version der Bibliothek noch unvollständig. So habe ich viel gegoogelt, und ich finde zwei Lösungen, eine von ihnen einfacher, und die andere viel breitere und komplexere Bibliothek.

So zum Beispiel in wenigen Zeilen kann ich das Ergebnis bekommen ich will (wo originalImage die UIImage ist anzuwenden, um den Effekt):

GPUImageGaussianBlurFilter *blurFilter = [[GPUImageGaussianBlurFilter alloc] init]; 
blurFilter.blurSize = 2; 
UIImage *blurImage = [blurFilter imageByFilteringImage:resizedImage]; 

UPDATE 2

Nachdem Apple iOS 7 angekündigt hatte, fanden einige Entwickler eine Problemumgehung, um dasselbe zu tun, was Apple in den Standard-iOS-Apps tat, da Apple dafür keine API zur Verfügung stellte. The simplest and better solution, in my opinion, is this one. Warum denke ich, dass es das Beste ist? Selbst wenn sich ein Blick dahinter bewegt, funktioniert die Unschärfe immer noch gut mit dem aktualisierten Effekt, wie wir es erwarten. Beachten Sie jedoch, dass es vom iOS 7 SDK abhängt, um zu funktionieren, und es kann riskant sein, wenn Apple UIToolbar ändert.

UPDATE 3

von Apple erwähnt, auf der WWDC 2013 (Session 226 - Umsetzung Engaging UI auf iOS) sie eine Kategorie Klasse auf UIImage bieten würde, die so genannte UIImage + ImageEffects (ich es googeln, and found here, aber es ist in Developer Portal - search for UIImageEffects in the search box verfügbar). Mit dieser Kategorie können Sie die Unschärfe in einem statischen UII-Bild anwenden, indem Sie verschiedene Methoden verwenden (hell, dunkel, mit einer bestimmten Farbe usw.). Auch, gestern I saw this component und fand es ziemlich interessant, wie Sie den Effekt (basierend auf der oben genannten Kategorie) in einem Rahmen anwenden können.

UPDATE 4

schließlich auf iOS 8 veröffentlichte Apple neue Klassen, die leicht Live-Unschärfe tun. Mit UIVisualEffect und UIVisualEffectView können Sie schnell Live-Unschärfe zu Ihren Apps hinzufügen. Here is a good tutorial from Ryan Nystrom on how to use those classes (and in blur in general):

+4

Sie müssen möglicherweise auch die Gaußsche Unschärfe mit einer weißen Farbe mischen, um genau das Aussehen zu erhalten, für das Sie oben gehen, und ich würde einen dedizierten Filter dafür irgendwann machen. Außerdem wollte ich mit texturiertem Milchglas experimentieren, wie es dieser Shader bietet: http://coding-experiments.blogspot.com/2010/06/frosted-glass.html –

+0

Und wie könnte ich das machen? Ich fühle, dass ich nicht habe, wo man docs lesen = (Konnte die Dokumente auch nicht kompilieren. –

+0

Für benutzerdefinierte Filter ist die beste Referenz, um zu sehen, wie die anderen Filter funktionieren. Zum Beispiel würde das oben verlinkte strukturierte Glas Wenn Sie einen benutzerdefinierten Fragment-Shader verwenden, müssen Sie einen neuen benutzerdefinierten Filter erstellen (indem Sie etwas ähnliches als Vorlage verwenden) und den Fragment-Shader ändern, den sie für die Arbeit in OpenGL ES bereitstellen.Für die hellere Unschärfe können Sie vielleicht einen Helligkeitsfilter mit der Gaußschen Unschärfe ketten oder im schlimmsten Fall eine Filtergruppe mit einem benutzerdefinierten Fragment-Shader für den Aufhellungsschritt erstellen. Die Kerndokumentation befindet sich in der Datei Readme.md. –

1

Werfen Sie einen Blick auf the Core Image Programming Guide. Es scheint, als ob die stylize filter und die blur filter Ihren Bedürfnissen entsprechen könnten. Ich habe noch nie zuvor mit Core Image gearbeitet, aber ich denke, dass es einige gute WWDC-Sitzungen geben kann, an denen sie beteiligt sind. Die Dokumentation hat a basic piece of sample code here.

+0

Es sieht so aus, dass iOS nicht alle Filter von OS X hat. Sie können das mit dem Code 'NSArray * properties = [CIFilter filterNamesInCategory: kCICategoryBuiltIn]; NSLog (@ "% @", Eigenschaften); ' –

+0

Ohne ins Detail zu gehen, haben Sie diesen Code auf iOS 6 ausgeführt? – Moshe

+0

Noch nicht. Prüfe meine eigene Antwort - gelöst! –

21

Lösung für iOS 7 und 8, ohne überhaupt mit Coreimage oder Core Graphics:

- (void)addBlurToView:(UIView *)view { 
    UIView *blurView = nil; 

    if([UIBlurEffect class]) { // iOS 8 
     UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleExtraLight]; 
     blurView = [[UIVisualEffectView alloc] initWithEffect:blurEffect]; 
     blurView.frame = view.frame; 

    } else { // workaround for iOS 7 
     blurView = [[UIToolbar alloc] initWithFrame:view.bounds]; 
    } 

    [blurView setTranslatesAutoresizingMaskIntoConstraints:NO]; 

    [view addSubview:blurView]; 
    [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[blurView]|" options:0 metrics:0 views:NSDictionaryOfVariableBindings(blurView)]]; 
    [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[blurView]|" options:0 metrics:0 views:NSDictionaryOfVariableBindings(blurView)]]; 
} 

(vorausgesetzt, Sie sind nicht Versionen älter als iOS 7 Targeting, wenn Sie sind, werden Sie haben Test für die iOS-Version im else Block)

Diese Lösung gilt für jede Ansicht, nicht nur Bilder.

+0

sehr nützliche Antwort, macht es einfach zu implementieren für iOS 7 und 8, nur eine Frage, vorausgesetzt, ich bin ständig hinzufügen und entfernen diese verschwommene Ansicht, soll ich entfernen die Einschränkungen hinzugefügt jedes Mal, wenn ich "die Ansicht aus Superview entfernen" (Ich benutze diesen Code, um ihn wieder hinzuzufügen, also weiß ich, dass Constrains ständig hinzugefügt werden) – Pochi

+0

Warum nicht einfach verstecken, anstatt es zu entfernen? – KPM

+2

Ausgezeichnetes Beispiel. Funktioniert super. –

2

Mit UIImageEffects

Wenn Sie mehr Kontrolle wünschen, wenn Unschärfe anwenden, können Sie die Verwendung von Apples UIImageEffects (erhältlich über ihren Beispielcode) machen.

Sie den Code für UIImageEffects von Apple Developer Library kopieren: Blurring and Tinting an Image

Und hier ist, wie es zu benutzen:

#import "UIImageEffects.h" 
... 

self.yourImageView.image = [UIImageEffects imageByApplyingLightEffectToImage:[UIImage imageNamed:@"yourImage.png"]];