Arrondir les coins d'une UIImage
apocaalypso
Membre
Bonjour,
Je voudrais vous faire partager ce petit bout de code assez pratique qui permet d'arrondir les coins d'une UIImage en choisissant le radius. Je l'ai eu grâce à ce blog : http://blog.sallarp.com/iphone-uiimage-round-corners/
- Tout d'abord, créez les .h et .m d'un NSObject, nommez-le ImageRoundedCorners ou comme vous le souhaitez
- dans le .h, ajoutez les méthodes :
- dans le .m :
Pour l'utiliser, tout d'abord importez le fichier .h :
Et utilisez la méthode ainsi :
Où 5 est le radius de votre image, plus cette valeur est grande plus les coins seront arrondis.
Voilà , j'espère qu'elle vous servira, car il est vrai que sur certaines interfaces graphiques, les coins arrondis sur les image sont les bienvenus !
Je voudrais vous faire partager ce petit bout de code assez pratique qui permet d'arrondir les coins d'une UIImage en choisissant le radius. Je l'ai eu grâce à ce blog : http://blog.sallarp.com/iphone-uiimage-round-corners/
- Tout d'abord, créez les .h et .m d'un NSObject, nommez-le ImageRoundedCorners ou comme vous le souhaitez
- dans le .h, ajoutez les méthodes :
static void addRoundedRectToPath(CGContextRef context, CGRect rect, float ovalWidth, float ovalHeight);<br />+(UIImage *)makeRoundCornerImage : (UIImage*) img : (int) cornerWidth : (int) cornerHeight;<br />
- dans le .m :
static void addRoundedRectToPath(CGContextRef context, CGRect rect, float ovalWidth, float ovalHeight)<br />{<br /> float fw, fh;<br /> if (ovalWidth == 0 || ovalHeight == 0) {<br /> CGContextAddRect(context, rect);<br /> return;<br /> }<br /> CGContextSaveGState(context);<br /> CGContextTranslateCTM (context, CGRectGetMinX(rect), CGRectGetMinY(rect));<br /> CGContextScaleCTM (context, ovalWidth, ovalHeight);<br /> fw = CGRectGetWidth (rect) / ovalWidth;<br /> fh = CGRectGetHeight (rect) / ovalHeight;<br /> CGContextMoveToPoint(context, fw, fh/2);<br /> CGContextAddArcToPoint(context, fw, fh, fw/2, fh, 1);<br /> CGContextAddArcToPoint(context, 0, fh, 0, fh/2, 1);<br /> CGContextAddArcToPoint(context, 0, 0, fw/2, 0, 1);<br /> CGContextAddArcToPoint(context, fw, 0, fw, fh/2, 1);<br /> CGContextClosePath(context);<br /> CGContextRestoreGState(context);<br />}<br /><br />+(UIImage *)makeRoundCornerImage : (UIImage*) img : (int) cornerWidth : (int) cornerHeight<br />{<br /> UIImage * newImage = nil;<br /> <br /> if( nil != img)<br /> {<br /> NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];<br /> int w = img.size.width;<br /> int h = img.size.height;<br /> <br /> CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();<br /> CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst);<br /> <br /> CGContextBeginPath(context);<br /> CGRect rect = CGRectMake(0, 0, img.size.width, img.size.height);<br /> addRoundedRectToPath(context, rect, cornerWidth, cornerHeight);<br /> CGContextClosePath(context);<br /> CGContextClip(context);<br /> <br /> CGContextDrawImage(context, CGRectMake(0, 0, w, h), img.CGImage);<br /> <br /> CGImageRef imageMasked = CGBitmapContextCreateImage(context);<br /> CGContextRelease(context);<br /> CGColorSpaceRelease(colorSpace);<br /> [img release];<br /> <br /> newImage = [[UIImage imageWithCGImage:imageMasked] retain];<br /> CGImageRelease(imageMasked);<br /> <br /> [pool release];<br /> }<br /> <br /> return newImage;<br />}<br />
Pour l'utiliser, tout d'abord importez le fichier .h :
#import "ImageRoundedCorners.h"
Et utilisez la méthode ainsi :
UIImage *monImage = [UIImage imageNamed:@"image.png"];<br />UIImage *imageArrondie = [ImageRoundedCorners makeRoundCornerImage: monImage :5 :5];
Où 5 est le radius de votre image, plus cette valeur est grande plus les coins seront arrondis.
Voilà , j'espère qu'elle vous servira, car il est vrai que sur certaines interfaces graphiques, les coins arrondis sur les image sont les bienvenus !
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Autre solution pour une UIImageView sans recréer d'image :
et pour matérialiser la bordure
J'ai bien la bordure, mais l'image reste carré, du coup ben elle dépasse du bord.
Ah oui et il faut importer #import <QuartzCore/QuartzCore.h> pour que ça marche
Une idée de pourquoi ça marche pas ?
Merci
Je vais regarder ça ce soir, je ne suis pas devant mon mac. Mais la doc ne trouve rien sur cette propriété
Je regarde ça en rentrant du taf, merci
Edit : En regardant un peu la doc, ça devrait fonctionner avec un
[layerRound setMasksToBounds:YES];
ou un
layerRound.masksToBounds = YES;
Je vous tiens au jus
Merci Ali