J'essaie de reproduire cet arrière-plan flou à partir de l'écran d'exemple iOS 7 publié par Apple:
Cette question suggère d'appliquer un filtre CI au contenu ci-dessous, mais c'est une approche complètement différente. Il est évident qu'iOS 7 ne capture pas le contenu des vues ci-dessous, pour de nombreuses raisons:
- Faire des tests approximatifs, capturer une capture d'écran des vues ci-dessous et appliquer un filtre CIGaussianBlur avec un rayon suffisamment grand pour imiter le style de flou d'iOS 7 prend 1-2 secondes, même sur un simulateur.
- La vue de flou iOS 7 est capable de flouter des vues dynamiques, telles qu'une vidéo ou des animations, sans décalage notable.
Quelqu'un peut-il émettre l'hypothèse des cadres qu'ils pourraient utiliser pour créer cet effet, et s'il est possible de créer un effet similaire avec les API publiques actuelles?
Éditer: (du commentaire) Nous ne savons pas exactement comment Apple le fait, mais y a-t-il des hypothèses de base que nous pouvons faire? Nous pouvons supposer qu'ils utilisent du matériel, non?
L'effet est-il autonome dans chaque vue, de sorte que l'effet ne sait pas réellement ce qu'il y a derrière? Ou, en fonction du fonctionnement du flou, le contenu derrière le flou doit-il être pris en considération?
Si le contenu derrière l'effet est pertinent, peut-on supposer qu'Apple reçoit un "flux" du contenu ci-dessous et le rend continuellement avec un flou?
la source
Réponses:
Pourquoi prendre la peine de reproduire l'effet? Dessinez simplement une barre d'outils UIT derrière votre vue.
la source
frame
outransform
de cette barre d'outils / vue ou quelque chose comme ça, sinon de mauvaises choses se produiront. Il a également fortement suggéré de déposer des rapports de bogues Radar à ce sujet, pour construire un cas en interne afin que nous puissions obtenir une véritable API publique pour cet effet!UITabBar
même.Apple a publié du code sur WWDC en tant que catégorie sur UIImage qui inclut cette fonctionnalité.Si vous avez un compte de développeur, vous pouvez récupérer la catégorie UIImage (et le reste de l'exemple de code) en allant sur ce lien: https://developer.apple. com / wwdc / horaire / et en parcourant la section 226 et en cliquant sur les détails. Je n'ai pas encore joué avec mais je pense que l'effet sera beaucoup plus lent sur iOS 6, il y a quelques améliorations à iOS 7 qui rendent la capture d'écran initiale qui est utilisée comme entrée pour le flou beaucoup plus rapide.
Lien direct: https://developer.apple.com/downloads/download.action?path=wwdc_2013/wwdc_2013_sample_code/ios_uiimageeffects.zip
la source
En fait, je parierais que ce serait assez simple à réaliser. Il ne fonctionnerait probablement pas ou ne ressemblerait pas exactement à ce qui se passe Apple, mais pourrait être très proche.
Tout d'abord, vous devez déterminer le CGRect de l'UIView que vous présenterez. Une fois que vous avez déterminé que vous auriez juste besoin de saisir une image de la partie de l'interface utilisateur afin qu'elle puisse être floue. Quelque chose comme ça...
Flou gaussien - Recommandé
En utilisant la
UIImage+ImageEffects
catégorie Apple fournie ici , vous obtiendrez un flou gaussien qui ressemble beaucoup au flou dans iOS 7.Box Blur
Vous pouvez également utiliser un flou de boîte en utilisant la
boxBlurImageWithBlur:
catégorie UIImage suivante . Ceci est basé sur un algorithme que vous pouvez trouver ici .Maintenant que vous calculez la zone d'écran à rendre floue, la passez dans la catégorie flou et recevez un retour UIImage flou, il ne reste plus qu'à définir cette image floue comme arrière-plan de la vue que vous allez présenter. Comme je l'ai dit, cela ne correspondra pas parfaitement à ce que fait Apple, mais cela devrait toujours être plutôt cool.
J'espère que ça aide.
la source
renderInContext
, utilisez le nouveaudrawViewHierarchyInRect:
ousnapshotView:
. Discours de la WWDC 216 "Implémentation de l'interface utilisateur engageante sur iOS7" revendique une amélioration des performances de 5 à 15 fois.iOS8 a répondu à ces questions.
- (instancetype)initWithEffect:(UIVisualEffect *)effect
ou Swift:
init(effect effect: UIVisualEffect)
la source
Je viens d'écrire ma petite sous-classe d'UIView qui a la capacité de produire un flou iOS 7 natif sur n'importe quelle vue personnalisée. Il utilise UIToolbar mais de manière sûre pour changer son cadre, ses limites, sa couleur et son alpha avec une animation en temps réel.
Veuillez me prévenir si vous remarquez des problèmes.
https://github.com/ivoleko/ILTranslucentView
la source
Il y a une rumeur selon laquelle les ingénieurs d'Apple prétendent que pour rendre cela performant, ils lisent directement la mémoire tampon du processeur graphique, ce qui pose des problèmes de sécurité.C'est pourquoi il n'y a pas encore d'API publique pour le faire.
la source
C'est une solution que vous pouvez voir dans les vidios de la WWDC. Vous devez faire un flou gaussien, donc la première chose que vous devez faire est d'ajouter un nouveau fichier .m et .h avec le code que j'écris ici, puis vous devez faire et faire une capture d'écran, utiliser l'effet souhaité et ajoutez-le à votre vue, puis à votre UITable UIView ou à tout ce qui doit être transparent, vous pouvez jouer avec applyBlurWithRadius, pour archiver l'effet souhaité, cet appel fonctionne avec n'importe quel UIImage.
À la fin, l'image estompée sera l'arrière-plan et les autres commandes ci-dessus doivent être transparentes.
Pour que cela fonctionne, vous devez ajouter les bibliothèques suivantes:
Acelerate.framework, UIKit.framework, CoreGraphics.framework
J'espère que tu aimes.
Codage heureux.
la source
Vous pouvez trouver votre solution dans DEMO d'Apple sur cette page: WWDC 2013 , découvrez et téléchargez l'exemple de code UIImageEffects.
Puis avec le code de @Jeremy Fox. Je l'ai changé en
J'espère que ceci vous aidera.
la source
Voici un moyen très simple de le faire: https://github.com/JagCesar/iOS-blur
Copiez simplement la couche de UIToolbar et vous avez terminé, AMBlurView le fait pour vous. D'accord, ce n'est pas aussi flou que le centre de contrôle, mais c'est assez flou.
N'oubliez pas qu'iOS7 est sous NDA.la source
Chaque réponse utilise ici vImageBoxConvolve_ARGB8888 cette fonction est vraiment, vraiment lente, c'est bien, si les performances ne sont pas une exigence de haute priorité, mais si vous l'utilisez pour la transition entre deux contrôleurs de vue (par exemple) cette approche signifie des temps supérieurs à 1 seconde ou peut-être plus, c'est très mauvais pour l'expérience utilisateur de votre application.
Si vous préférez laisser tout ce traitement d'image au GPU (et vous devriez), vous pouvez obtenir un bien meilleur effet et également des temps impressionnants en arrondissant 50 ms (en supposant que vous avez un temps de 1 seconde dans la première approche), alors, faisons-le .
Téléchargez d'abord le GPUImage Framework (licence BSD) ici .
Ensuite, ajoutez les classes suivantes (.m et .h) à partir de GPUImage (je ne suis pas sûr que ce soit le minimum nécessaire pour l'effet de flou uniquement)
GPUImageTwoPassTextureSamplingFilter
iOS / GPUImage-Prefix.pch
Ensuite, créez une catégorie sur UIImage, qui ajoutera un effet de flou à un UIImage existant:
Enfin, ajoutez les cadres suivants à votre projet:
AVFoundation CoreMedia CoreVideo OpenGLES
Oui, je me suis amusé avec cette approche beaucoup plus rapide;)
la source
Vous pouvez essayer d'utiliser ma vue personnalisée, qui a la capacité de rendre l'arrière-plan flou. Il le fait en simulant un instantané de l'arrière-plan et en le floutant, tout comme celui du code WWDC d'Apple. C'est très simple à utiliser.
J'ai également fait quelques améliorations pour simuler le flou dynamique sans perdre les performances. L'arrière-plan de ma vue est un scrollView qui défile avec la vue, fournissant ainsi l'effet de flou pour le reste de la vue d'ensemble.
Voir l'exemple et le code sur mon GitHub
la source
Core Background implémente l'effet iOS 7 souhaité.
https://github.com/justinmfischer/core-background
Avertissement: je suis l'auteur de ce projet
la source