CALayer альфа-маска не работает - PullRequest
3 голосов
/ 06 мая 2011

Я пытаюсь создать простой пример рисования изображения в слое и установки альфа-маски этого слоя. Я добавил следующий код в viewDidLoad моего примера приложения. не устанавливая маску, я могу видеть изображение листа. после того, как я установил маску, я ничего не вижу там, где был мой подслой. Что я делаю неправильно?

Вот два изображения, которые я использую (только образцы, которые я нашел в сети) http://sorenworlds.netfirms.com/Alpha/leaf.jpg

http://sorenworlds.netfirms.com/Alpha/leaf-alfa.jpg

self.view.layer.backgroundColor = [UIColor orangeColor].CGColor;
self.view.layer.cornerRadius = 20.0;
self.view.layer.frame = CGRectInset(self.view.layer.frame, 20, 20);


CALayer *sublayer = [CALayer layer];
sublayer.backgroundColor = [UIColor blueColor].CGColor;
sublayer.shadowOffset = CGSizeMake(0, 3);
sublayer.shadowRadius = 5.0;
sublayer.shadowColor = [UIColor blackColor].CGColor;
sublayer.shadowOpacity = 0.8;
sublayer.frame = CGRectMake(30, 30, 128, 192);
[self.view.layer addSublayer:sublayer];

CGImageRef img = [UIImage imageNamed:@"leaf.jpg"].CGImage;
sublayer.borderColor = [UIColor blackColor].CGColor;
sublayer.borderWidth = 2.0;
sublayer.contents = img;

CGImageRef imgAlpha = [UIImage imageNamed:@"leaf_alpha.jpg"].CGImage;   
CALayer *alphaLayer = [CALayer layer];
alphaLayer.contents = (id)imgAlpha;
sublayer.mask = alphaLayer;

Любая помощь очень ценится.

1 Ответ

11 голосов
/ 07 мая 2011

Есть несколько проблем с вашим кодом:

  1. Ссылка на класс CALayer говорит, что альфа слоя маски используется для маскировки родительского слоя. Ваш слой маски (alphaLayer) создается с помощью JPG, который не содержит альфа-значений. Кварц не понимает, что вы хотите использовать значения пикселей RGB в оттенках серого в изображении маски в качестве альфа-значений, и нет никакого кода, который вы могли бы вызвать для этого (насколько я знаю).

    Кварц, вероятно, интерпретирует отсутствие альфа в изображении маски как 0 альфа для каждого пикселя, поэтому ничего не отображается.

    Я предлагаю получить программу рисования, такую ​​как Pixelmator, и сделать PNG-файл (со встроенными альфа-значениями) из исходного листового изображения. Это устраняет необходимость добавления маскирующего кода в код.

  2. Ваше имя файла "leaf-alfa.jpg", но в вашем коде это "leaf_alpha.jpg".

  3. Подслои должны быть размещены в координатах родительского слоя. Вы этого не сделали и не установили границу для маскирующего слоя. Границей слоя по умолчанию является пустой прямоугольник, поэтому даже если вы используете изображение с соответствующей альфа-маской, вы все равно ничего не увидите (или, может быть, просто оригинальное изображение листа без маскировки). Вам нужно сделать что-то вроде этого:

    alphaLayer.bounds = CGRectMake(0, 0, 128, 192);
    alphaLayer.position = CGPointMake(sublayer.bounds.size.width/2.0,
                                      sublayer.bounds.size.height/2.0);
    
...