IOS:创build具有圆angular的UIImage或UIImageView
是否有可能创build一个UIImage
或UIImageView
圆angular? 因为我想要一个UIImage
并将其显示在一个UIImageView
,但是我不知道该怎么做。
对的,这是可能的。
导入QuartzCore
( #import <QuartzCore/QuartzCore.h>
)标题,并使用UIImageView
的layer
属性进行播放。
yourImageView.layer.cornerRadius = yourRadius; yourImageView.clipsToBounds = YES;
有关更多信息,请参阅CALayer类参考。
试试这个代码为圆形图像导入QuartzCore框架创build圆形图像的简单方法
imageView.layer.backgroundColor=[[UIColor clearColor] CGColor]; imageView.layer.cornerRadius=20; imageView.layer.borderWidth=2.0; imageView.layer.masksToBounds = YES; imageView.layer.borderColor=[[UIColor redColor] CGColor];
Objective-C的
-(UIImage *)makeRoundedImage:(UIImage *) image radius: (float) radius; { CALayer *imageLayer = [CALayer layer]; imageLayer.frame = CGRectMake(0, 0, image.size.width, image.size.height); imageLayer.contents = (id) image.CGImage; imageLayer.masksToBounds = YES; imageLayer.cornerRadius = radius; UIGraphicsBeginImageContext(image.size); [imageLayer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *roundedImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return roundedImage; }
Swift 3
func makeRoundedImage(image: UIImage, radius: Float) -> UIImage { var imageLayer = CALayer() imageLayer.frame = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height) imageLayer.contents = image.cgImage imageLayer.masksToBounds = true imageLayer.cornerRadius = radius UIGraphicsBeginImageContext(image.size) imageLayer.render(in: UIGraphicsGetCurrentContext()) var roundedImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return roundedImage }
uiimageview.layer.cornerRadius = uiimageview.frame.size.height/2; uiimageview.clipToBounds = YES; #import <QuartzCore/QuartzCore.h>
// UIImageView+OSExt.h #import <UIKit/UIKit.h> @interface UIImageView (OSExt) - (void)setBorder:(CGFloat)borderWidth color:(UIColor*)color; @end // UIImageView+OSExt.m #import "UIImageView+OSExt.h" @implementation UIImageView (OSExt) - (void)layoutSublayersOfLayer:(CALayer *)layer { for ( CALayer *sub in layer.sublayers ) { if ( YES == [sub.name isEqual:@"border-shape"]) { CGFloat borderHalf = floor([(CAShapeLayer*)sub lineWidth] * .5); sub.frame = layer.bounds; [sub setBounds:CGRectInset(layer.bounds, borderHalf, borderHalf)]; [sub setPosition:CGPointMake(CGRectGetMidX(layer.bounds), CGRectGetMidY(layer.bounds))]; } } } - (void)setBorder:(CGFloat)borderWidth color:(UIColor*)color { assert(self.frame.size.width == self.frame.size.height); for ( CALayer *sub in [NSArray arrayWithArray:self.layer.sublayers] ) { if ( YES == [sub.name isEqual:@"border-shape"]) { [sub removeFromSuperlayer]; break; } } CGFloat borderHalf = floor(borderWidth * .5); self.layer.cornerRadius = self.layer.bounds.size.width * .5; CAShapeLayer *circleLayer = [CAShapeLayer layer]; self.layer.delegate = (id<CALayerDelegate>)self; circleLayer.name = @"border-shape"; [circleLayer setBounds:CGRectInset(self.bounds, borderHalf, borderHalf)]; [circleLayer setPosition:CGPointMake(CGRectGetMidX(self.layer.bounds), CGRectGetMidY(self.layer.bounds))]; [circleLayer setPath:[[UIBezierPath bezierPathWithOvalInRect:circleLayer.bounds] CGPath]]; [circleLayer setStrokeColor:color.CGColor]; [circleLayer setFillColor:[UIColor clearColor].CGColor]; [circleLayer setLineWidth:borderWidth]; { circleLayer.shadowOffset = CGSizeZero; circleLayer.shadowColor = [[UIColor whiteColor] CGColor]; circleLayer.shadowRadius = borderWidth; circleLayer.shadowOpacity = .9f; circleLayer.shadowOffset = CGSizeZero; } // Add the sublayer to the image view's layer tree [self.layer addSublayer:circleLayer]; // old variant //CALayer *layer = self.layer; //layer.masksToBounds = YES; //layer.cornerRadius = self.frame.size.width * 0.5; //layer.borderWidth = borderWidth; //layer.borderColor = color; } @end
设置cornerRadius
和clipsToBounds
是正确的方法来做到这一点。 但是,如果视图的大小发生变化,半径将不会更新。 为了获得适当的大小和animation行为,您需要创build一个UIImageView
子类。
class RoundImageView: UIImageView { override var bounds: CGRect { get { return super.bounds } set { super.bounds = newValue setNeedsLayout() } } override func layoutSubviews() { super.layoutSubviews() layer.cornerRadius = bounds.width / 2.0 clipsToBounds = true } }
试试这个来获得图像视angular的圆angular,并为angular落着色:
imageView.layer.cornerRadius = imageView.frame.size.height/2; imageView.layer.masksToBounds = YES; imageView.layer.borderColor = [UIColor colorWithRed:148/255. green:79/255. blue:216/255. alpha:1.0].CGColor; imageView.layer.borderWidth=2;
条件*:imageView的高度和宽度必须相同以得到圆angular。
这是可能的,但我会build议你创build具有圆angular的透明png图像(蒙版),并将其放在你的图像与UIImageView。 这可能是更快的解决scheme(例如,如果你需要animation或滚动)。
在这里,我如何设置我的圆angular头像在它的中心包含视图:
-(void)setRoundedAvatar:(UIImageView *)avatarView toDiameter:(float)newSize atView:(UIView *)containedView; { avatarView.layer.cornerRadius = newSize/2; avatarView.clipsToBounds = YES; avatarView.frame = CGRectMake(0, 0, newSize, newSize); CGPoint centerValue = CGPointMake(containView.frame.size.width/2, containedView.frame.size.height/2); avatarView.center = centerValue; }
用UIBeizerPath#Swift-3 && #imageExtension圈起来
class ViewController: UIViewController { @IBOutlet weak var imageOutlet: UIImageView! override func viewDidLoad() { super.viewDidLoad() let image = UIImage(named: "IMG_0001.JPG") if let image = image { let renderimage = image.imageCroppingBezierPath(path: UIBezierPath(arcCenter: CGPoint(x:image.size.width/2,y:image.size.width/2 ) , radius: 200, startAngle: 0, endAngle: (2 * CGFloat(M_PI) ), clockwise: true) ) imageOutlet.image = renderimage } } } extension UIImage { func imageCroppingBezierPath(path:UIBezierPath) ->UIImage { let frame = CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height) //Defining a graphic context to paint on UIGraphicsBeginImageContextWithOptions(self.size, false, 0.0) //Get the current graphics context (if it exists) let context = UIGraphicsGetCurrentContext() //save the current graphic context context?.saveGState() // clipping area path.addClip() self.draw(in: frame) //To extract an image from our canvas let image = UIGraphicsGetImageFromCurrentImageContext() //restore graphic context context?.restoreGState() //remove current context from stack UIGraphicsEndImageContext() return image! } }
# import QuartzCore framework imageView.layer.cornerRadius=imgvwUser.frame.size.width/2; imageView.layer.masksToBounds = YES;
imageView的高度和宽度必须相同以得到圆angular。