UIView drawRect рисует линии неправильной ширины - PullRequest
5 голосов
/ 07 сентября 2010

Я пытаюсь добавить маленькую красную линию в нижней части моего UIView.

Я хочу, чтобы линия была 1px.

Может кто-нибудь сказать мне, почему следующий код:

- (void)drawRect:(CGRect)rect {
CGContextRef currentContext = UIGraphicsGetCurrentContext();
CGContextSaveGState(currentContext);
CGContextSetRGBFillColor(currentContext, 0.0f, 0.0f, 0.0f, 1.0f);
CGContextFillRect(currentContext, RECT(0, 0, rect.size.width, rect.size.height - 8));
CGContextSetLineWidth(currentContext, 1);
CGContextSetRGBStrokeColor(currentContext, 1.0f, 0.0f, 0.0f, 1.0f);
CGContextBeginPath(currentContext);
CGContextMoveToPoint(currentContext, 0, rect.size.height - 7);
CGContextAddLineToPoint(currentContext, rect.size.width, rect.size.height - 7);
CGContextStrokePath(currentContext);
CGContextRestoreGState(currentContext);
}

Рисует линию, которая охватывает 2 пикселя в высоту?

Ответы [ 3 ]

14 голосов
/ 07 сентября 2010

Интегральные координаты указывают места на полпути между пикселями; то есть (0,0) находится в верхнем левом углу, выше и слева от верхнего левого пикселя ; аналогично, (1,0) равно между первым и вторым пикселями; наконец, (0.5,0.5) находится в центре верхнего левого пикселя.

В соответствии с документацией для CGContextSetLineWidth , "при штриховании линия пересекает путь, причем половина от общей ширины по обе стороны" Таким образом, если путь лежит точно между пикселями, линия будет штриховаться наполовину в одном ряду пикселей, наполовину в другом.

Следовательно, чтобы получить четкую линию пикселей, вы должны сместить свои координаты на полпикселя: для вашей x координаты используйте rect.size.height - 7.5 вместо - 7.

Кстати, при рисовании прямоугольников удобно использовать CGRectInset(rect, 0.5, 0.5) для достижения этой цели.

1 голос
/ 07 сентября 2010

Вы используете iPhone 4?В iPhone 4 используется система координат с масштабным коэффициентом 2. Поэтому вам нужно установить ширину линии на 0,5, чтобы получить то, что вы хотите.

(Система координат настроена таким образом, чтобыодин и тот же код выдает одинаковый вывод на всех моделях.)

0 голосов
/ 07 сентября 2010

Линии по умолчанию нарисованы сглаженными (если вы не настроили иначе). Таким образом, любая линия, которая не является строго вертикальной или горизонтальной и начинается и заканчивается в пикселе, вероятно, частично покрывает несколько пикселей в некоторых строках и / или столбцах, делая ее похожей на более широкую серую линию вместо тонкой высококонтрастной линии.

...