Как сделать сглаживающие слои в iPhoneOS

У нас были деньги Райнера Книзиа уже пару месяцев. Это сделано довольно хорошо, и поэтому мы обновляли его, как позволяет время. Тем не менее, одна вещь продолжает беспокоить меня. Мне никогда не удавалось правильно вывести свои многослойные карты на сглаживание.

Вот пример:

альтернативный текст

Карты, которые лежат прямо, очень чистые, но всякий раз, когда они наклонены, черные линии вокруг карт становятся неровными. Я пробовал это в зависимости от обеих линий, неявных для иллюстрации и линий, нарисованных через drawRect:, и они обе делают одно и то же. Я пробовал edgeAntiAliasingMask, и он, насколько я могу судить, ничего не делает. Я пробовал masksToBounds для подслоев, установленных на NO и YES.

Прямо сейчас моя карта настроена как CALayer, который имеет суб-CALayers для передней и задней части, а также для некоторых других вещей, таких как осветляющая маска и затемняющая маска. Вот некоторые фрагменты кода:

   CArdLayer *theCardLayer = [CArdLayer layer];
   theCardLayer.edgeAntialiasingMask = kCALayerLeftEdge | kCALayerRightEdge | kCALayerBottomEdge | kCALayerTopEdge;

   theCardLayer.front = [CALayer layer];
   theCardLayer.front.edgeAntialiasingMask = kCALayerLeftEdge | kCALayerRightEdge | kCALayerBottomEdge | kCALayerTopEdge;
   theCardLayer.front.bounds = theCardLayer.bounds;
   theCardLayer.front.masksToBounds = YES;
   theCardLayer.front.contents = (id)[cardDrawing CGImage];

   [theCardLayer addSublayer:theCardLayer.front];

Так далее...

Любые идеи о том, как сделать карты на самом деле сглаживание?

4 ответа

Решение

Наилучший результат, который я смог придумать, это сделать то, что я предложил в своем комментарии: я увеличил каждый (прозрачный) рисунок на 1 пиксель с каждой стороны. С этим небольшим запасом, карты гораздо лучше сочетаются с фоном.

Таким образом, не точно ответ с кодом iPhone, но тот, который, тем не менее, работает на iPhone.

Вот "после" выстрел, который вы можете сравнить с "до", выше:альтернативный текст

Это имеет эффект добавления прозрачной границы:

layer.cornerRadius = 1.01;

Если вы не хотите запускать фотошоп, вот способ, которым вы можете сделать это программно:

http://vocaro.com/trevor/blog/2009/10/12/resize-a-uiimage-the-right-way/

В частности, -transparentBorderImage: метод категории в UIImage+Alpha.h/.m.

Надеюсь, что это помогает другим там.

Спасибо http://vocaro.com/trevor/blog!

Я никогда не использовал фреймворк, но похоже, что сглаживание работает только на внутренней стороне карты, а не на внешней (предположим, что закругленные углы на не повернутых картах - особый случай).

Так что ИМХО это на самом деле проблема композиции карт и фона.

Быстрый просмотр документации предлагает некоторые советы (только предположения, попробуйте их):

Удостовериться Opaque свойство равно false (возможно, то, что вы видите, является результатом оптимизации кода рендеринга).

Проверьте, как это выглядит, если вы установите непрозрачность на "почти непрозрачный" (возможно, 0,9?).

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

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