Le flou de l'écran avec iOS 7 de l'instantané de l'API
Je crois que le NDA est en bas, donc je peux poser cette question. J'ai une UIView sous-classe:
BlurView *blurredView = ((BlurView *)[self.view snapshotViewAfterScreenUpdates:NO]);
blurredView.frame = self.view.frame;
[self.view addSubview:blurredView];
Il fait son travail jusqu'à présent dans la capture de l'écran, mais maintenant je veux le flou de ce point de vue. Exactement comment dois-je aller à ce sujet? De ce que j'ai lu, j'ai besoin de capturer le contenu actuel de la vue (?!) et la convertir en CIImage (non?) et ensuite, appliquez une CIGaussianBlur à elle et la ramener sur la vue.
Comment dois-je faire exactement?
P. S. Le point de vue qui n'est pas animé, donc ça devrait être OK performance sage.
EDIT: Voici ce que j'ai jusqu'à présent. Le problème est que je ne peux pas saisir un instantané d'une UIImage, j'obtiens un écran noir. Mais si j'ajoute le point de vue comme une sous-vue directement, je peux voir la capture est là.
//Snapshot
UIView *view = [self.view snapshotViewAfterScreenUpdates:NO];
//Convert to UIImage
UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//Apply the UIImage to a UIImageView
BlurView *blurredView = [[BlurView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
[self.view addSubview:blurredView];
blurredView.imageView.image = img;
//Black screen -.-
BlurView.m:
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
//Initialization code
self.imageView = [[UIImageView alloc] init];
self.imageView.frame = CGRectMake(20, 20, 200, 200);
[self addSubview:self.imageView];
}
return self;
}
J'ai vérifié, mais il utilise une image de l'actif comme une source, mais j'ai besoin d'utiliser un instantané. Qui je ne peux pas comprendre.
OriginalL'auteur Nikolay Dyankov | 2013-09-22
Vous devez vous connecter pour publier un commentaire.
Exemple de Code à partir de la WWDC ios_uiimageeffects
Il y a un
UIImage
catégorie nomméeUIImage+ImageEffects
Voici son API:
Pour des raisons légales, je ne peux pas montrer la mise en œuvre ici, il y a un projet de démonstration. devrait être assez facile à démarrer avec.
Si vous voulez seulement l'image, il n'est pas nécessaire pour l'instantané de l'API. juste le rendu de l'image directement sur
self.view
?Alors, où puis-je obtenir de l'image si je n'ai pas instantané de l'écran?
UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, self.view.opaque, 0.0);
puis[self.view.layer renderInContext:UIGraphicsGetCurrentContext]
Je ne pense pas que ce sera jamais travailler. Je pense que la raison pour laquelle cela ne fonctionne pas (écran noir), la vue retournée par l'instantané est en fait PAS un à part entière de la vue. Si vous entrez par le débogueur, vous verrez qu'il est de type '_UIReplicantView'. Cela me fait penser que c'est juste une copie optimisée de l'autre point de vue, et n'a pas le même "niveau" que les caractéristiques d'une "pleine" UIView...
OriginalL'auteur Kyle Fang
De la moitié de cette question n'a pas répondu, alors j'ai pensé qu'il vaut la peine d'ajouter.
Le problème avec UIScreen de
et UIView de
Est que vous ne pouvez pas déduire une UIImage d'eux - le "écran noir" problème.
Dans iOS7 Apple fournit un troisième morceau de l'API pour l'extraction UIImages, une méthode sur UIView
Il n'est pas aussi rapide que
snapshotView
, mais comparé à pas mal d'renderInContext
(dans l'exemple fourni par Apple, il est cinq fois plus rapide querenderInContext
et trois fois plus lent quesnapshotView
)Exemple d'utilisation:
Ensuite pour obtenir une version floue
où
applyLightEffect
est l'un de ceux Flou de la catégorie des méthodes sur l'AppleUIImage+ImageEffects
catégorie mentionnée dans l'acceptation de la réponse (le séduisant lien pour cet exemple de code dans la accepté de répondre ne fonctionne pas, mais cela vous mènera à la page de droite: le fichier que vous voulez estiOS_UIImageEffects
).La référence principale est de WWDC2013 session 226, Engager la mise en Œuvre de l'INTERFACE utilisateur sur iOS
Par le façon, il ya un intrigant note d'Apple dans la référence de docs pour
renderInContext
que des indications à l'écran noir problème..La note n'a pas été mis à jour depuis 10.5, donc je suppose que 'les futures versions" peut encore être un certain temps, et nous pouvons ajouter notre nouveau
CASnapshotLayer
(ou autre) à la liste.OriginalL'auteur foundry
Pour résumer comment faire cela avec de la fonderie exemple de code, utilisez la commande suivante:
Je voulais le flou de la totalité de l'écran, juste un peu pour mes besoins, donc je vais utiliser l'écran principal de limites.
Notes sur la capture d'écran de la partie
UIGraphicsBeginImageContextWithOptions()
2ème argument est l'opacité. Il devrait êtreNO
à moins que vous n'avez rien à toutalpha
autres que1
. Si vous retournez oui la capture d'écran ne sera pas regarder à des valeurs de transparence, de sorte qu'il sera plus rapide, mais sera probablement tort.UIGraphicsBeginImageContextWithOptions()
3ème argument est l'échelle. Vous voulez probablement mettre à l'échelle de l'appareil comme je l'ai fait pour assurer et faire la différence entre la rétine et de la non-retina. Mais je n'ai pas vraiment testé, et je pense que0.0f
fonctionne également.drawViewHierarchyInRect:afterScreenUpdates:
regarder ce que vous revenez pour les mises à jour d'écranBOOL
. J'ai essayé de faire de ce droit, avant de la semi-finition et si je n'ai pas misNO
l'application serait de fou avec des saccades lorsque je suis retourné à la premier plan. Vous pourriez être en mesure de s'en tirer avecYES
bien que si vous n'êtes pas quitter l'application.Notes sur le flou
J'ai un très léger flou ici. La modification de la blurRadius permettra de faire de plus en plus floue, et vous pouvez changer la teinte de la couleur et de l'alpha à faire toutes sortes d'autres effets.
Aussi, vous devez ajouter une catégorie pour le flou des méthodes de travail...
Comment ajouter de la UIImage+ImageEffects catégorie
Vous devez télécharger la catégorie UIImage+ImageEffects pour le flou de travail. Télécharger ici après la connexion: https://developer.apple.com/downloads/index.action?name=WWDC%202013
De la recherche pour "UIImageEffects" et vous le trouverez. Suffit d'enlever les 2 fichiers nécessaires et de les ajouter à votre projet. UIImage+ImageEffects.h et UIImage+ImageEffects.m.
Aussi, j'ai dû Activer les Modules dans mes paramètres de construction parce que j'avais un projet qui n'a pas été créée avec xCode 5. Pour ce faire, allez à votre cible paramètres de construction et de recherche pour les "modules" et assurez-vous que l'option "Activer les Modules" et "Lien de Cadres Automatiquement" sont à la fois défini à oui ou vous aurez des erreurs de compilation avec la nouvelle catégorie.
Bonne chance flou!
OriginalL'auteur teradyl
Vérifier la WWDC 2013 exemple d'application "en cours d'exécution avec un composant logiciel enfichable".
Le flou est-il mis en œuvre en tant que catégorie.
OriginalL'auteur Sulthan