Mon code fonctionne bien pour les appareils normaux, mais crée des images floues sur les appareils rétiniens.
Quelqu'un connaît-il une solution à mon problème?
+ (UIImage *) imageWithView:(UIView *)view
{
UIGraphicsBeginImageContext(view.bounds.size);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return img;
}
Réponses:
Passez de l'utilisation de
UIGraphicsBeginImageContext
àUIGraphicsBeginImageContextWithOptions
(comme indiqué sur cette page ). Passez 0,0 pour l'échelle (le troisième argument) et vous obtiendrez un contexte avec un facteur d'échelle égal à celui de l'écran.UIGraphicsBeginImageContext
utilise un facteur d'échelle fixe de 1,0, vous obtenez donc exactement la même image sur un iPhone 4 que sur les autres iPhones. Je parie que l'iPhone 4 applique un filtre lorsque vous le modifiez implicitement ou que votre cerveau le détecte moins net que tout ce qui l'entoure.Donc je suppose:
Et dans Swift 4:
la source
#import <QuartzCore/QuartzCore.h>
pour supprimer l'renderInContext:
avertissement.UIImage
de recharger mais de forcer la version haute résolution (et vous vous heurteriez probablement à des problèmes en raison de la moindre RAM disponible en pré -retina quand même).0.0f
pour le paramètre d'échelle, est-il plus acceptable d'utiliser[[UIScreen mainScreen] scale]
, cela fonctionne aussi.scale: The scale factor to apply to the bitmap. If you specify a value of 0.0, the scale factor is set to the scale factor of the device’s main screen.
C'est explicitement documenté, donc 0.0f est plus simple et meilleur à mon avis.La réponse actuellement acceptée est désormais obsolète, du moins si vous prenez en charge iOS 7.
Voici ce que vous devriez utiliser si vous ne supportez que iOS7 +:
Swift 4:
Selon cet article , vous pouvez voir que la nouvelle méthode iOS7
drawViewHierarchyInRect:afterScreenUpdates:
est beaucoup plus rapide querenderInContext:
.la source
drawViewHierarchyInRect:afterScreenUpdates:
c'est beaucoup plus rapide. Je viens de lancer un Time profiler dans Instruments. Ma génération d'images est passée de 138 ms à 27 ms.afterScreenUpdates:
àYES
?viewDidLoad
ou queviewWillAppear:
les images sont noires; Je devais le faireviewDidAppear:
. Je suis donc finalement revenu àrenderInContext:
.J'ai créé une extension Swift basée sur la solution @Dima:
EDIT: Swift 4 version améliorée
Usage:
la source
class
fonction qui prend une vue?static
fonction mais comme il n'est pas nécessaire de la remplacer, vous pouvez simplement la changer enstatic
func au lieu declass
.Utilisation de UIGraphicsImageRenderer moderne
la source
renderer
à l'anciendrawHierarchy
..?Pour améliorer les réponses de @Tommy et @Dima, utilisez la catégorie suivante pour rendre UIView en UIImage avec un fond transparent et sans perte de qualité. Travailler sur iOS7. (Ou réutilisez simplement cette méthode dans l'implémentation, en remplaçant la
self
référence par votre image)UIView + RenderViewToImage.h
UIView + RenderViewToImage.m
la source
@interface
et les@implementation
deux(RenderViewToImage)
et d'ajouter#import "UIView+RenderViewToImage.h"
à l'en-têteViewController.h
donc est-ce la bonne utilisation? par exempleUIImageView *test = [[UIImageView alloc] initWithImage:[self imageByRenderingView]]; [self addSubview:test];
?ViewController.m
était la vue que j'ai essayé de rendre- (UIView *)testView { UIView *v1 = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 50, 50)]; v1.backgroundColor = [UIColor redColor]; UIView *v2 = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 150, 150)]; v2.backgroundColor = [UIColor blueColor]; [v2 addSubview:v1]; return v2; }
Swift 3
La solution Swift 3 (basée sur la réponse de Dima ) avec l'extension UIView devrait ressembler à ceci:
la source
Extension Drop-in Swift 3.0 qui prend en charge la nouvelle API iOS 10.0 et la méthode précédente.
Remarque:
!
ce qui pourrait provoquer un crash.la source
Swift 2.0:
En utilisant la méthode d'extension:
Usage:
la source
Implémentation de Swift 3.0
la source
Toutes les réponses de Swift 3 n'ont pas fonctionné pour moi, j'ai donc traduit la réponse la plus acceptée:
la source
Voici une extension Swift 4 UIView basée sur la réponse de @Dima.
la source
Pour Swift 5.1, vous pouvez utiliser cette extension:
la source
https://nshipster.com/image-resizing/
Assurez-vous donc que la taille dans laquelle vous passez est en
UIGraphicsImageRenderer
points, pas en pixels.Si vos images sont plus grandes que prévu, vous devez diviser votre taille par le facteur d'échelle.
la source
Parfois, la méthode drawRect pose problème, j'ai donc obtenu ces réponses plus appropriées. Vous aussi, vous pouvez y jeter un œil Capture UIImage de UIView coincé dans la méthode DrawRect
la source
la source
Dans cette méthode, passez simplement un objet de vue et il retournera un objet UIImage.
la source
Ajoutez cette méthode à la catégorie UIView
la source