Рисование прямоугольника с помощью Core Graphics на iPhone

Я пытаюсь нарисовать прямоугольник в своем подклассе UIView, и все работает, за исключением того, что ширина линии удваивается (я использую банкомат iPhone Simulator в версии Retina).

Это метод drawRect:

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGRect innerRect = CGRectInset(rect, 5, 5);
    CGContextSetStrokeColorWithColor(context, [[UIColor whiteColor] CGColor]);
    CGContextSetLineWidth(context, 2);
    CGContextMoveToPoint(context, CGRectGetMinX(innerRect), CGRectGetMinY(innerRect));
    CGContextAddLineToPoint(context, CGRectGetMaxX(innerRect), CGRectGetMinY(innerRect));
    CGContextAddLineToPoint(context, CGRectGetMaxX(innerRect), CGRectGetMaxY(innerRect));
    CGContextAddLineToPoint(context, CGRectGetMinX(innerRect), CGRectGetMaxY(innerRect));
    CGContextClosePath(context);
    CGContextStrokePath(context);
}

Этот код рисует прямоугольник в правильном месте, но шириной 4 пикселя, а не указанными 2 пикселями.

Глядя в Интернет, я вижу, что мне, возможно, придется установить коэффициент масштабирования, поэтому я попытался добавить:

    self.contentScaleFactor = [UIScreen mainScreen].scale;
    self.layer.contentsScale = [UIScreen mainScreen].scale;

в начале метода, и когда это не сработало, я попробовал:

    self.contentScaleFactor = 2;
    self.layer.contentsScale = 2;

(поскольку 2 — это число, которое должен возвращать метод scale для дисплеев сетчатки) И это тоже не сработало.

Это просто проблема с симулятором, которая будет исправлена, когда я запущу его на устройстве? (Я обновил его до 5.1, но забыл обновить Xcode, поэтому в настоящее время я жду 2 часа из 7-часового ожидания завершения загрузки обновления Xcode)

Или я что-то упускаю?


person Jonathan.    schedule 03.12.2011    source источник
comment
Вы можете сэкономить много кода, используя функция CGContextStrokeRectWithWidth.   -  person Peter Hosey    schedule 04.12.2011
comment
@PeterHosey, я знаю, я на самом деле рисую прямоугольник со скругленными углами, я просто избавился от кода дуг и упростил координаты, чтобы вопрос было легче читать.   -  person Jonathan.    schedule 04.12.2011


Ответы (1)


Это правильное поведение.

Вы указываете ширину 2 точки (не пиксели). На стандартном экране это соответствует 2 пикселям, а на дисплее Retina — 4 пикселям. Вы также должны заметить, что размер прямоугольника, который вы передаете, не меняется ни со стандартом, ни с сетчаткой. Apple рекомендует рисовать точками, а не пикселями.

Хорошей ссылкой является видео «WWDC 2011 Session 129 — Практический рисунок для разработчиков iOS». Хотя видео в целом информативно, суть того, о чем вы говорите, начинается примерно с 10:24 видео.

person NJones    schedule 03.12.2011
comment
Спасибо за ваш ответ, я знал о точках -> пикселях, я запутался, в какую сторону они идут :) - person Jonathan.; 03.12.2011
comment
Еще больше о пиксельном идеальном рисовании в видео на 22:11. - person bentford; 30.04.2015