Свойства тени Mimic CALayer найдены в iPhone OS 3.2 для OS 3.1 - PullRequest
0 голосов
/ 13 мая 2010

Свойства теней CALayer, такие как shadowOffset, shadowRadius, shadowColor, недоступны в версиях iPhone OS ниже 3.2, и мне интересно, как можно имитировать эту функциональность для использования с 3.1 и ниже.

Я хочу использовать это, чтобы иметь возможность добавлять тени в UIViews чистым способом, чтобы тени каким-то образом рисовались на уровне слоя, а не путем рисования в методе -(void)drawRect:(CGRect)rect представления, который требует уменьшения фактического размера. рамка для размещения тени. (Этот сокращающий подход был предложен в других вопросах, связанных с тенями UIView, которые я нашел здесь на SO).

Я думал, что многоуровневый подход будет чище. Например, я попытался создать подкласс CALayer, к которому я добавил отдельный теневой слой в качестве подслоя, но затем он был бы нарисован поверх всего, что было нарисовано в drawRect: метод UIView, у которого основной слой был задним слоем.

Я также пытался реализовать подкласс CALayer drawInContext: что-то вроде этого,

- (void)drawInContext:(CGContextRef)ctx {
// code to draw shadow for a frame the size of the layer's frame        
[super drawInContext:ctx];
}

Но затем тень все еще обрезается до текущего ограничивающего прямоугольника контекста, который, по-видимому, является собственным кадром слоев.

У меня также была некоторая идея перенаправить рисунок основного слоя на подслой, который был бы помещен над другим подслоем, на котором была нарисована тень. Тогда я, вероятно, избавлюсь от отсечения, и тень будет дальше всего. Но я не мог по-настоящему обернуться, как бы я это сделал, и на самом деле это не похоже на чистый подход.

Есть идеи, как это сделать? Просто чтобы прояснить, чем мой вопрос, связанный с тенью на UIView, отличается от других, которые я нашел здесь на SO; Я не хочу уменьшать фактическую рамку рисования UIView, чтобы приспособить для тени. Я хочу, чтобы он как-то находился на отдельном слое на заднем плане, без обрезки.

1 Ответ

0 голосов
/ 28 мая 2010

Вы можете создать изображение, имитирующее тень, и просто масштабировать его, возможно, автоматически, указав ему указатель на любой вид. Затем он автоматически настроит себя и расположится ниже этого уровня в любом суперпредставлении, которое имеет этот вид.

Это работает довольно хорошо. Тень должна составлять около 50% размера экрана, поэтому среднее расширение / сжатие довольно невидимо. Если у него большой радиус, вы действительно не сможете определить, масштабирован он или нет.

...