почему initWithPatternImage теряет альфа-значения PNG

Кто-нибудь когда-нибудь видел проблему [UIColor initWithPatternImage] игнорирования альфа-значений PNG? Если да, то какое исправление лучше всего?

Я использую png в качестве фонового слоя для моего массива объектов кнопок, и он содержит несколько предварительно установленных альфа-значений на пиксель в изображении, которое будет использоваться в качестве фона текстуры. Он отлично загружается как цвет узора / текстуры, но все ключевые прозрачные области отображаются как непрозрачный черный.

Важно, чтобы я получил правильные альфа-значения, чтобы изображения кнопок отображались правильно. Рамки кнопок не включают альфа-тени от фона, поскольку это не "кликабельная" часть кнопки. Кроме того, изображения моего объекта кнопки и фоновые изображения также используют прозрачность, поэтому ему действительно необходимо иметь чистый фон непосредственно за каждой кнопкой, чтобы обеспечить правильные текущие настройки цвета (нижний слой UIView будет иметь цвет фона, установленный на цвет, выбранный текущим пользователем). Установка только одного альфа-значения для слоя UIView, содержащего эту текстуру, тоже не подходит для моих нужд.

Любая помощь будет оценена. Мой текущий обходной путь - использовать полностью развернутую, многократно программируемую компоновку из нескольких UIImageView с использованием png вместо одного UIView с заливкой узором.

Вот фрагмент кода, но он довольно стандартен для превращения UIImage в UIColor для использования в качестве цвета узора / текстуры:

    UIView *selectorView = [[UIView alloc] initWithFrame:CGRectMake(0,0,320,320)];
    UIColor *background  = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"SelectorViewBackground.png"]];

    selectorView.backgroundColor = background;

    [mainView addSubview:selectorView]; // pattern background layer. Add UIButtons on top of this selectorView layer
    [self addSubview:mainView]; // current user selected color set in mainView.
    [selectorView release];
    [background release];

person Natchaphon S.    schedule 23.02.2011    source источник


Ответы (4)


У меня была такая же проблема с установкой фона в UIView с некоторой прозрачностью, вот как я ее решил:

theView.backgroundColor = [UIColor clearColor];
theView.layer.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"the_image_with_transparancy.png"]].CGColor;
person fredrik    schedule 07.07.2011
comment
Он работал у меня большую часть времени, но проблема в том, что он может перевернуть данное изображение. Возможное решение: stackoverflow.com/a/5917849/936957 - person Yunus Nedim Mehel; 12.03.2013

Вероятно, это связано с:

Мозаичное фоновое изображение: Могу ли я легко сделать это с помощью UIImageView?

В принципе, попробуйте установить:

[view setOpaque:NO];
[[view layer] setOpaque:NO];
person Jai    schedule 05.05.2011

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

Я бы посмотрел в ваш файл PNG. Я заметил, что iOS иногда привередлива с определенными параметрами / типами PNG (например, 8-битный PNG с 8-битной прозрачностью). Убедитесь, что ваш PNG сохранен как 24-битный с 8-битной прозрачностью (всего 32 бита).

Кроме того, глупый вопрос, но вы проверили, что за вашим PNG нет ничего черного в иерархии представлений / слоев? Иногда это такие глупые вещи

person Jay    schedule 23.02.2011
comment
Привет, Джей, Большое спасибо за твой ответ. Да, я трижды проверил PNG, любые представления позади, и это всего 32 бита. Поскольку все находится внутри представления прокрутки, поэтому, наконец, я решил создать несколько UIImageView, уложенных вертикально на основе количества строк UIButton, и это помогло, поскольку он также легко прокручивается с помощью массива UIButtons. Тот же PNG имеет прозрачность, отлично работающую как UIImageView. Когда-нибудь, если у меня будет время, я проверю разницу при использовании слоев. Ваше здоровье! :) - person Natchaphon S.; 24.02.2011

Для тех, кому может понадобиться код обхода, где фоновые шаблоны могут быть выложены в виде строк в UIScrollView, вот он (с поправкой на устранение проблем с конфиденциальностью, должен работать, если переменные правильно установлены до вызова).

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

    UIImageView *selectorView;
    for (int i = 0; i < numRows; ++i) {
        selectorView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SelectorViewBackground.png"]];
        selectorView.frame = CGRectMake(0, i * patternHeight, patternWidth, patternHeight);
        [mainView addSubview:selectorView];
        [selectorView release];         
    }
person Natchaphon S.    schedule 24.02.2011
comment
если вы повторно используете одно и то же изображение, почему вы создаете новый для каждого цикла? Сохраните UIImage вне цикла, а затем назначьте ему свое представление в цикле. Сэкономит вам кучу звонков и займет меньше времени, чем я потратил на набор этого комментария. - person Jay; 24.02.2011
comment
Я знаю. Я думал об этом, копируя код в постинг. Сначала выдергиваю волосы, чтобы уложить все к сроку ... Я скоро уберу это. Еще раз спасибо, Джей. - person Natchaphon S.; 24.02.2011