У меня есть CATiledLayer, в котором я представляю содержание в следующем методе
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
Я использовал код QuartzDemo потянуть шаблон. Это работает очень хорошо, пока я не подаю заявку, вращение преобразовывают к parentLayer слоя (UIView):
повернутый:
Эти зигзагообразные артефакты становятся хуже, когда я начинаю проводить линии и тексты в CATiledLayer.
Я применил преобразование следующим образом (я также пытался использовать аффинное преобразование на самом представлении):
self.containerView.layer.transform = CATransform3DMakeRotation(angleRadians, 0.0f, 0.0f, 1.0f);
Я преобразовываю containerView, а не сам слой, поскольку у меня есть несколько слоев в том представлении, что я хотел бы вращаться одновременно, не меняя относительные положения.
У меня не было проблем при вращении UIImageViews в прошлом.
Существует ли способ, которым я могу повернуть CATiledLayer без этих проблем?
Любая справка значительно ценилась бы.
Ваш,
Felix
Единственный способ исправить эту проблему, который я обнаружил, заключался в следующем:
Возможно, это поможет: быстрое и грязное сглаживание ... . В частности, убедитесь, что сглаживание включено.
CGContextSetAllowsAntialiasing(theContext, true);
CGContextSetShouldAntialias(theContext, true);
Как уже отмечал Райан Закри, здесь вам поможет сглаживание. Эффект, который вы здесь испытываете, называется эффектом «лестницы».
Пиксели имеют квадратную форму, поэтому можно легко рисовать прямые линии (горизонтальные или вертикальные) без каких-либо артефактов. Если вы рисуете линии под углом, вам нужно будет растрировать линию. Алгоритм рисования линий должен будет сделать приближения при попытке сопоставить линию с пикселями. Примером такого алгоритма является Брезенхэма (очень популярный и простой в реализации, но не имеющий сглаживания). Вот что он делает:
Как вы можете очень ясно видеть на На этой картинке, проведя линию под любым углом, получается так называемый эффект лестницы. Чтобы избежать этого эффекта, вы можете использовать сглаживание. Сглаживание фактически является частью теории сигналов. Это метод минимизации артефактов искажения, известный как наложение спектров при представлении сигнала высокого разрешения при более низком разрешении. Как видно из приведенного выше примера строки, это очень хорошо применимо к компьютерной графике.
Сглаживание действительно сложно, но идея состоит в том, чтобы улучшить изображение, аппроксимируя линию не только на попиксельной основе, но также используя интеллектуальную окраску, чтобы линия появлялась в определенном месте, отличном от пикселя. точный.
Чтобы включить встроенное сглаживание в Core Graphics, сделайте следующее перед выполнением ротации:
CGContextSetAllowsAntialiasing(theContext, true);
CGContextSetShouldAntialias(theContext, true);
Обратите внимание, что сглаживание может быть очень дорогостоящим с точки зрения вычислительной мощности, вы должны использовать его только при необходимости.