почему initWithPatternImage теряет альфа-значения PNG - PullRequest
3 голосов
/ 23 февраля 2011

Кто-нибудь когда-либо видел проблему [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];

Ответы [ 4 ]

3 голосов
/ 07 июля 2011

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

theView.backgroundColor = [UIColor clearColor];
theView.layer.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"the_image_with_transparancy.png"]].CGColor;
1 голос
/ 05 мая 2011

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

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

Обычно попробуйте установить:

[view setOpaque:NO];
[[view layer] setOpaque:NO];
0 голосов
/ 24 февраля 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];         
    }
0 голосов
/ 23 февраля 2011

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

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

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

...