J'ai essayé de masquer un UIImage dans un cercle . J'utilise maintenant le code qui a été populaire pour d'autres réponses ici, mais bien que j'obtienne un cercle, ses bords sont très déchiquetés et non lisses . Quelqu'un peut aider? Est-ce que je reçois un cercle parfait et lisse?
Le code que j'utilise pour créer le masque est:
(UIImage*) maskImage:(UIImage *)image withMask:(UIImage *)maskImage {
CGImageRef imageNoAlpha = image.CGImage;
CGColorSpaceRef cs = CGColorSpaceCreateDeviceRGB();
CGFloat width = CGImageGetWidth(imageNoAlpha);
CGFloat height = CGImageGetWidth(imageNoAlpha);
CGContextRef ctxWithAlpha = CGBitmapContextCreate(nil, width, height, 8, 4*width, cs, kCGImageAlphaPremultipliedFirst);
CGContextDrawImage(ctxWithAlpha, CGRectMake(0, 0, width, height), imageNoAlpha);
CGImageRef imageWithAlpha = CGBitmapContextCreateImage(ctxWithAlpha);
CGImageRef maskRef = maskImage.CGImage;
CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
CGImageGetHeight(maskRef),
CGImageGetBitsPerComponent(maskRef),
CGImageGetBitsPerPixel(maskRef),
CGImageGetBytesPerRow(maskRef),
CGImageGetDataProvider(maskRef), NULL, false);
CGImageRef masked = CGImageCreateWithMask(imageWithAlpha, mask);
UIImage* retImage= [UIImage imageWithCGImage:masked];
UIImage* retImageFixed = [retImage transparentBorderImage:1];
CGImageRelease(mask);
CGImageRelease(masked);
CGImageRelease(imageWithAlpha);
CGContextRelease(ctxWithAlpha);
CGColorSpaceRelease(cs);
return retImageFixed;
Merci d'avance...
essayez ce code
yourImageView.layer.cornerRadius = yourImageView.frame.size.height /2;
yourImageView.layer.masksToBounds = YES;
yourImageView.layer.borderWidth = 0;
cette image de spectacle comme ios 7 image de cercle merci
Cela peut vous aider à définir un rayon de coin égal à la moitié de la vue de référence sur laquelle vous souhaitez afficher l'image ou à définir un rectangle personnalisé.
par exemple. Dans mon cas, je veux afficher l'image sur un "imageView" , de sorte que le rayon de l'angle dans ce cas serait imageView.frame.size.width/2
- (void)displayImage
{
imageView.image = [self getRoundedRectImageFromImage:@"Test.png" onReferenceView:imageView withCornerRadius: imageView.frame.size.width/2];
}
- (UIImage *)getRoundedRectImageFromImage :(UIImage *)image onReferenceView :(UIImageView*)imageView withCornerRadius :(float)cornerRadius
{
UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, NO, 1.0);
[[UIBezierPath bezierPathWithRoundedRect:imageView.bounds
cornerRadius:cornerRadius] addClip];
[image drawInRect:imageView.bounds];
UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return finalImage;
}
Désolé pour le formatage moche . Meilleure version de la réponse de aToz.
@interface UIImage (CircleMask)
+ (UIImage *)roundedRectImageFromImage :(UIImage *)image
size :(CGSize)imageSize
withCornerRadius :(float)cornerRadius;
@end
@implementation UIImage(CircleMask)
+(UIImage*)roundedRectImageFromImage:(UIImage *)image
size:(CGSize)imageSize
withCornerRadius:(float)cornerRadius
{
UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0.0); // <= notice 0.0 as third scale parameter. It is important cause default draw scale ≠ 1.0. Try 1.0 - it will draw an ugly image..
CGRect bounds=(CGRect){CGPointZero,imageSize};
[[UIBezierPath bezierPathWithRoundedRect:bounds
cornerRadius:cornerRadius] addClip];
[image drawInRect:bounds];
UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return finalImage;
}
@end
La même chose à Swift:
extension UIImage{
class func roundedRectImageFromImage(image:UIImage,imageSize:CGSize,cornerRadius:CGFloat)->UIImage{
UIGraphicsBeginImageContextWithOptions(imageSize,false,0.0)
let bounds=CGRect(Origin: CGPointZero, size: imageSize)
UIBezierPath(roundedRect: bounds, cornerRadius: cornerRadius).addClip()
image.drawInRect(bounds)
let finalImage=UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return finalImage
}
}
Une meilleure version des réponses de aToz et fnc12 (en Swift):
extension UIImage
{
func roundImage() -> UIImage
{
let newImage = self.copy() as! UIImage
let cornerRadius = self.size.height/2
UIGraphicsBeginImageContextWithOptions(self.size, false, 1.0)
let bounds = CGRect(Origin: CGPointZero, size: self.size)
UIBezierPath(roundedRect: bounds, cornerRadius: cornerRadius).addClip()
newImage.drawInRect(bounds)
let finalImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return finalImage
}
}
Usage:
self.userImageView.image = image.roundedImage()
Qu'en est-il de l'aide de UIImageView
+ (UIImage *)circularImage:(UIImage *)image withDiameter:(NSUInteger)diameter
{
CGRect frame = CGRectMake(0.0f, 0.0f, diameter, diameter);
UIImageView *imageView = [[UIImageView alloc] initWithFrame:frame];
imageView.contentMode = UIViewContentModeScaleAspectFill;
imageView.clipsToBounds = YES;
imageView.image = image;
CALayer *layer = imageView.layer;
layer.masksToBounds = YES;
layer.cornerRadius =MAX( imageView.frame.size.height,imageView.frame.size.width)/2;
UIGraphicsBeginImageContextWithOptions(imageView.bounds.size,NO, [UIScreen mainScreen].scale);
CGContextRef context = UIGraphicsGetCurrentContext();
[layer renderInContext:context];
UIImage *roundedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return roundedImage;
}
Si vous utilisez Swift, vous pouvez importer 'AlamofireImage' et utiliser l'un de ses fonctions. Pour l'image encerclée:
let roundImage = UIImage(named: "myImage")!.af_imageRoundedIntoCircle()
essaye ça
UIImageView *circleImageview=[[UIImageView alloc]init];
circleImageview.frame=CGRectMake(0,10, 80, 80)];
circleImageview.layer.cornerRadius=circleimagview.frame.size.height/2;
circleImageview.userInteractionEnabled=YES;
[self.view addSubview:circleImageview];
Remarque: Assurez-vous que la hauteur et la largeur seront identiques à celles de cette vue.
Si vous utilisez une UIImageView
et que vous souhaitez animer la taille de l'image tout en conservant les coins arrondis, vous pouvez appliquer une transformation comme suit:
Objectif c
// Our UIImageView reference
@property (weak, nonatomic) IBOutlet UIImageView *myImageView;
- (void)viewDidLoad {
[super viewDidLoad];
myImageView.layer.cornerRadius = myImageView.frame.size.width / 2.0f;
myImageView.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.4f, 0.4f);
}
- (void)viewDidAppear:(BOOL)animated {
[UIView animateWithDuration:1.0 animations:^{
myImageView.transform = CGAffineTransformIdentity;
}];
}
Rapide
// Our UIImageView reference
@IBOutlet weak var myImageView:UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
myImageView.layer.cornerRadius = myImageView.frame.size.width / 2;
myImageView.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.4, 0.4)
}
override func viewDidAppear(animated: Bool) {
UIView.animateWithDuration(1.0) {
myImageView.transform = CGAffineTransformIdentity;
}
}
REMARQUE: Ceci maintiendra également tout AutoLayout constraints
.