Нарисуй простой круг
Я пытаюсь сделать 20x20 UIImage с простым синим кругом. Я пытаюсь с этой функцией, но в результате синий круг в черном квадрате. Как мне удалить черный квадрат вокруг круга?
Функция:
+ (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;
}
фактический результат:
8 ответов
Вам нужно включить альфа-канал в ваше растровое изображение: UIGraphicsBeginImageContextWithOptions(..., NO, ...)
если вы хотите увидеть, что находится за углами.
Спасибо за вопросы и ответы! Свифт код, как показано ниже:
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 от Schemetrical:
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
}
}
Свифт 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
}
}
Свифт автозамены благочестивый. Спасибо Валентину.
Я просто хочу добавить, что самый простой и сексуальный способ рисования фигур и их в виде растровых изображений (с прозрачным фоном), который я нашел, - это то, как Пол Хадсон сделал это на своем веб-сайте hackingwithswift.com.
Фрагмент с сайта:
let renderer = UIGraphicsImageRenderer(size: CGSize(width: 512, height: 512))
let img = renderer.image { ctx in
ctx.cgContext.setFillColor(UIColor.red.cgColor)
ctx.cgContext.setStrokeColor(UIColor.green.cgColor)
ctx.cgContext.setLineWidth(10)
let rectangle = CGRect(x: 0, y: 0, width: 512, height: 512)
ctx.cgContext.addEllipse(in: rectangle)
ctx.cgContext.drawPath(using: .fillStroke)
}
Образец Xamarin.iOS:
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;
}
Попробуй это
UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, NO, 1.0);
Пользовательский инициализатор для создания круга с определенным диаметром и цветом:
extension UIImage {
convenience init?(diameter: CGFloat, color: UIColor) {
let size = CGSize(width: diameter, height: diameter)
UIGraphicsBeginImageContextWithOptions(size, false, 0)
guard let contex = UIGraphicsGetCurrentContext() else {
return nil
}
contex.saveGState()
let rect = CGRect(origin: .zero, size: size)
contex.setFillColor(color.cgColor)
contex.fillEllipse(in: rect)
contex.restoreGState()
guard let image = UIGraphicsGetImageFromCurrentImageContext(),
let cgImage = image.cgImage else {
return nil
}
UIGraphicsEndImageContext()
self.init(cgImage: cgImage)
}
}
Я думаю, что это немного лучше сделать с помощью удобной инициализации и UIGraphicsImageRenderer.
public extension UIImage {
convenience init?(circleDiameter: CGFloat, color: UIColor) {
let size = CGSize(width: circleDiameter, height: circleDiameter)
let renderer = UIGraphicsImageRenderer(size: size)
let image = renderer.image { (ctx) in
color.setFill()
ctx.cgContext.fillEllipse(in: CGRect(origin: .zero, size: size))
}
guard let cgImage = image.cgImage else {
return nil
}
self.init(cgImage: cgImage)
}
}