Рисование вокруг CGContextRef для удаления пикселов

В настоящее время у меня есть графическая проблема с рисованием маленьких точек.

Я заметил, что в большинстве профессиональных приложений Календаря идентификатор календаря событий представляет собой небольшую точку, цвет которой соответствует цвету календаря событий.

Я действую в точке моего приложения, где мне нужно нарисовать ЛУЧШУЮ точку. Вот фото того, что я имею в виду.

CalendarTableCell

Это может быть не заметно здесь, но цветная точка довольно неровная, когда она на моем телефоне. Я хотел бы удалить пикселизацию.

Я прошел учебник с сайта Рэя Вендерлиха: Ray Wenderlich Core Graphics.

Вот что я получил для рисования точки:

UIGraphicsBeginImageContext(cell.imageViewPic.bounds.size);
CGContextRef contextRef = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(contextRef, [[event calendar] CGColor]);
CGContextFillEllipseInRect(contextRef,(CGRectMake (0.f, 0.f, cell.imageViewPic.bounds.size.width, cell.imageViewPic.bounds.size.height)));

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
cell.imageViewPic.image = image;

Так что это фактически реализует круг, но я добавил это, чтобы нарисовать маленькую линию вокруг круга, чтобы избавиться от пикселизации, но не идти.

CGPoint startPoint = CGPointMake(cell.imageViewPic.frame.origin.x, cell.imageViewPic.frame.origin.y + cell.imageViewPic.frame.size.height - 1);
CGPoint endPoint = CGPointMake(cell.imageViewPic.frame.origin.x + cell.imageViewPic.frame.size.width - 1, cell.imageViewPic.frame.origin.y + cell.imageViewPic.frame.size.height - 1);
UIColor* color = [UIColor blackColor];
CGContextSaveGState(contextRef);
CGContextSetLineCap(contextRef, kCGLineCapSquare);
CGContextSetStrokeColorWithColor(contextRef, color.CGColor);
CGContextSetLineWidth(contextRef, 10.0);
CGContextMoveToPoint(contextRef, startPoint.x + 0.5, startPoint.y + 0.5);
CGContextAddLineToPoint(contextRef, endPoint.x + 0.5, endPoint.y + 0.5);
CGContextStrokePath(contextRef);
CGContextRestoreGState(contextRef);

Все вместе выглядит так...

UIGraphicsBeginImageContext(cell.imageViewPic.bounds.size);
CGContextRef contextRef = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(contextRef, [[event calendar] CGColor]);
CGContextFillEllipseInRect(contextRef,(CGRectMake (0.f, 0.f, cell.imageViewPic.bounds.size.width, cell.imageViewPic.bounds.size.height)));

CGPoint startPoint = CGPointMake(cell.imageViewPic.frame.origin.x, cell.imageViewPic.frame.origin.y + cell.imageViewPic.frame.size.height - 1);
CGPoint endPoint = CGPointMake(cell.imageViewPic.frame.origin.x + cell.imageViewPic.frame.size.width - 1, cell.imageViewPic.frame.origin.y + cell.imageViewPic.frame.size.height - 1);
UIColor* color = [UIColor blackColor];
CGContextSaveGState(contextRef);
CGContextSetLineCap(contextRef, kCGLineCapSquare);
CGContextSetStrokeColorWithColor(contextRef, color.CGColor);
CGContextSetLineWidth(contextRef, 10.0);
CGContextMoveToPoint(contextRef, startPoint.x + 0.5, startPoint.y + 0.5);
CGContextAddLineToPoint(contextRef, endPoint.x + 0.5, endPoint.y + 0.5);
CGContextStrokePath(contextRef);
CGContextRestoreGState(contextRef);

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
cell.imageViewPic.image = image;

Круг по-прежнему нарисован, но "штрих" не рисуется.

Если кто-нибудь даст несколько советов, как решить эту проблему, пожалуйста, напишите!

2 ответа

Решение

Пикселизация происходит потому, что когда вы создаете контекст изображения, вы не учитываете масштаб экрана. Ваш код должен выглядеть примерно так (обратите внимание на 1-ю строку):

UIGraphicsBeginImageContextWithOptions(cell.imageViewPic.bounds.size, NO, [UIScreen mainScreen].scale)
CGContextRef contextRef = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(contextRef, [[event calendar] CGColor]);
CGContextFillEllipseInRect(contextRef,(CGRectMake (0.f, 0.f, cell.imageViewPic.bounds.size.width, cell.imageViewPic.bounds.size.height)));

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
cell.imageViewPic.image = image;

Обновление: как кто-то прокомментировал, вы можете перейти в 0 вместо [UIScreen mainScreen].scale, Документы согласны:

Масштабный коэффициент, применяемый к растровому изображению. Если указать значение 0,0, коэффициент масштабирования будет установлен на коэффициент масштабирования главного экрана устройства.

Это тот же ответ, что и @Christian Di Lorenzo. Но это короче, более прямолинейно.

Изменить это:

UIGraphicsBeginImageContext(cell.imageViewPic.bounds.size);

К этому:

UIGraphicsBeginImageContextWithOptions(cell.imageViewPic.bounds.size, NO, [UIScreen mainScreen].scale);

Другие вопросы по тегам