2013-11-21 8 views
29

Ich versuche, ein 20x20 UIImage mit einem einfachen blauen Kreis zu machen. Ich versuche mit dieser Funktion, aber das Ergebnis ist ein blauer Kreis in einem schwarzen Quadrat. Wie entferne ich das schwarze Quadrat um den Kreis?Zeichnen Sie einen einfachen Kreis uiimage

Funktion:

+ (UIImage *)blueCircle { 
    static UIImage *blueCircle = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     UIGraphicsBeginImageContextWithOptions(CGSizeMake(20.f, 20.f), YES, 0.0f); 
     CGContextRef ctx = UIGraphicsGetCurrentContext(); 
     CGContextSaveGState(ctx); 

     CGRect rect = CGRectMake(0, 0, 20, 20); 
     CGContextSetFillColorWithColor(ctx, [UIColor cyanColor].CGColor); 
     CGContextFillEllipseInRect(ctx, rect); 

     CGContextRestoreGState(ctx); 
     blueCircle = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 

    }); 
    return blueCircle; 
} 

tatsächliches Ergebnis: enter image description here

+1

Möglicherweise sollten Sie eine Ansicht verwenden, anstatt ein Imageview http://stackoverflow.com/questions/6589265/how-to- Draw-a-custom-uiview-das-ist-nur-ein-Kreis-iphone-app – Woodstock

Antwort

29

Sie benötigen Alpha-Kanal in der Bitmap enthalten: UIGraphicsBeginImageContextWithOptions(..., NO, ...) wenn Sie sehen wollen, was hinter den Ecken ist.

27

Danke für die Q & A! Swift Code wie folgt:

extension UIImage { 
    class func circle(diameter: CGFloat, color: UIColor) -> UIImage { 
     UIGraphicsBeginImageContextWithOptions(CGSizeMake(diameter, diameter), false, 0) 
     let ctx = UIGraphicsGetCurrentContext() 
     CGContextSaveGState(ctx) 

     let rect = CGRectMake(0, 0, diameter, diameter) 
     CGContextSetFillColorWithColor(ctx, color.CGColor) 
     CGContextFillEllipseInRect(ctx, rect) 

     CGContextRestoreGState(ctx) 
     let img = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 

     return img 
    } 
} 

Swift 3 Version von Schemetrical bereitgestellt:

extension UIImage { 
    class func circle(diameter: CGFloat, color: UIColor) -> UIImage { 
     UIGraphicsBeginImageContextWithOptions(CGSize(width: diameter, height: diameter), false, 0) 
     let ctx = UIGraphicsGetCurrentContext()! 
     ctx.saveGState() 

     let rect = CGRect(x: 0, y: 0, width: diameter, height: diameter) 
     ctx.setFillColor(color.cgColor) 
     ctx.fillEllipse(in: rect) 

     ctx.restoreGState() 
     let img = UIGraphicsGetImageFromCurrentImageContext()! 
     UIGraphicsEndImageContext() 

     return img 
    } 
} 
+0

Swift 3 Code unten für andere. Danke für die Lösung übrigens. – Schemetrical

5

Swift 3 & 4:

extension UIImage { 
    class func circle(diameter: CGFloat, color: UIColor) -> UIImage { 
     UIGraphicsBeginImageContextWithOptions(CGSize(width: diameter, height: diameter), false, 0) 
     let ctx = UIGraphicsGetCurrentContext()! 
     ctx.saveGState() 

     let rect = CGRect(x: 0, y: 0, width: diameter, height: diameter) 
     ctx.setFillColor(color.cgColor) 
     ctx.fillEllipse(in: rect) 

     ctx.restoreGState() 
     let img = UIGraphicsGetImageFromCurrentImageContext()! 
     UIGraphicsEndImageContext() 

     return img 
    } 
} 

Swift autocorrect ist godly. Danke an Valentin.

2

Xamarin.iOS Beispiel:

public static UIImage CircleImage(nfloat diameter, UIColor color, bool opaque = false) 
    { 
     var rect = new CGRect(0, 0, diameter, diameter); 

     UIGraphics.BeginImageContextWithOptions(rect.Size, opaque, 0); 
     var ctx = UIGraphics.GetCurrentContext(); 
     ctx.SaveState(); 

     ctx.SetFillColor(color.CGColor); 
     ctx.FillEllipseInRect(rect); 

     ctx.RestoreState(); 
     var img = UIGraphics.GetImageFromCurrentImageContext(); 
     UIGraphics.EndImageContext(); 

     return img; 
    } 
1

Try this

UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, NO, 1.0);