Фрэнсис МакГрю уже дал правильный ответ, но так как я однажды сделал презентацию по этому вопросу, я подумал, что добавлю несколько фотографий.
Проблема здесь в том, что координаты в Кварцележат на пересечениях между пикселями.Это хорошо при заполнении прямоугольника, потому что каждый пиксель, который находится внутри координат, заполняется.Но линии технически (математически!) Невидимы.Чтобы нарисовать их, Кварц должен нарисовать прямоугольник с заданной шириной линии.Этот прямоугольник центрируется по координатам:
![The rectangle you tell Quartz to draw when you specify integral coordinates](https://i.stack.imgur.com/ih96U.png)
Таким образом, когда вы просите Кварц обвести прямоугольник с интегральными координатами, возникает проблема, заключающаяся в том, что он может рисовать только целые пиксели.Но здесь вы видите, что у нас есть половина пикселей.Так что он делает это в среднем цвет.Для линии 50% черного (цвет линии) и 50% белого (фон) он просто рисует каждый пиксель серым цветом:
![Half pixels averaged out when drawing between pixels](https://i.stack.imgur.com/tQcgo.png)
Это место, где вы размылирисунки приходят.Исправление теперь очевидно: не рисуйте между пикселями, и вы достигнете этого, переместив свои точки на полпикселя, чтобы ваша координата была центрирована по желаемому пикселю:
![Coordinates offset by 0.5 towards lower right](https://i.stack.imgur.com/hnV7i.png)
Теперь, конечно, просто смещение может быть не тем, что вы хотели.Потому что, если вы сравните заполненный вариант с штрихованным, обводка будет на один пиксель больше в правом нижнем углу.Например, если вы обрежете прямоугольник, это обрезает нижнюю правую часть:
![Comparison between offset stroked and non-offset filled rectangle](https://i.stack.imgur.com/C8l3K.png)
Поскольку люди обычно ожидают, что прямоугольник будет штриховать внутри указанного прямоугольника, что вы обычно делаетеэто то, что вы смещены на 0,5 к центру , поэтому нижний правый угол фактически сдвигается на один пиксель вверх.С другой стороны, многие приложения для рисования смещены на 0,5 от от центра, чтобы избежать наложения между границей и заливкой (что может выглядеть странно при рисовании с прозрачностью).
Обратите внимание, чтоэто справедливо только для 1x экранов.Экран 2x Retina на самом деле демонстрирует эту проблему по-разному, потому что каждый из пикселей ниже фактически отрисовывается 4 пикселями Retina, что означает, что они могут на самом деле рисовать полупиксели.Тем не менее, у вас все еще есть та же проблема, если вы хотите резкую линию 0.5pt.Кроме того, так как Apple может в будущем представить другие экраны Retina, где, например, каждый пиксель состоит из 9 пикселей Retina (3x) или чего-либо еще, вам не следует полагаться на это.Вместо этого теперь есть вызовы API для преобразования прямоугольников в «выравнивание по сторонам», что делает это для вас, независимо от того, используете ли вы 1x, 2x или вымышленный 3x.
PS - Так как я пошел виз-за трудностей с написанием всего этого, я разместил это на своем веб-сайте: http://orangejuiceliberationfront.com/are-your-rectangles-blurry-pale-and-have-rounded-corners/, где я обновлю и пересмотрю это описание и добавлю больше изображений.