Прозрачность UIView показывает, как делают колбасы! - PullRequest
4 голосов
/ 05 апреля 2010

У меня есть UIView контейнер, в котором есть два UIImageView s, один частично закрывает другой (они составляются таким образом, чтобы обеспечить случайную анимацию того или иного "слоя".

Иногда я хочу сделать этот контейнер 50% альфа, так что то, что видят пользователи, исчезает. Вот проблема: установка моего контейнерного представления на 50% альфа заставляет все мои подпредставления наследовать это также, и теперь вы можете видеть через первое подпредставление во второе, что в моем приложении имеет странный эффект рентгена, что я не находясь в поиске.

Конечно, после того, что пользователь видит на 50% прозрачным, я собираюсь сделать то же самое, что эквивалентно сглаживанию видимого изображения в одном растровом изображении, а затем созданию 50% альфа.

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

Спасибо!

РЕДАКТИРОВАТЬ: Спасибо за мысли, ребята. Я просто перемещаю одно изображение поверх другого, которое оно лишь частично затеняет. И эта пара изображений тоже иногда должна двигаться вместе. И иногда я хочу постепенно все это исчезнуть, где бы оно ни было, и каким бы ни было состояние пары изображений в данный момент. Позже я хочу вернуть его и продолжить анимацию.

Создание снимка контейнера, либо путем рендеринга его слоя (?), Либо путем создания других закадровых композиций на лету перед альфа-обработкой всего объекта, безусловно, возможно, и я знаю, что есть несколько способов сделай это. Но что, если анимация должна продолжаться, пока все это находится на 50% альфа, например?

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

Ответы [ 4 ]

3 голосов
/ 20 октября 2011

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

Решением, которое я нашел, было использование CALayers вместо UIViews и установка свойства .shouldRasterize на YES в слое контейнера, чтобы любые подслои автоматически выравнивались до применения непрозрачности.

Вот как может выглядеть UIView:

#import <QuartzCore/QuartzCore.h>   //< Needed to use CALayers

...

@interface MyView : UIView{
    CALayer *layer1;
    CALayer *layer2;
    CALayer *compositingLayer;  //< Layer where compositing happens.
}

...

- (void)initialization
{   
    UIImage *im1 = [UIImage imageNamed:@"image1.png"];
    UIImage *im2 = [UIImage imageNamed:@"image2.png"];

    /***** Setup the layers *****/
    layer1 = [CALayer layer];
    layer1.contents = im1.CGImage;  
    layer1.bounds = CGRectMake(0, 0, im1.size.width, im1.size.height);
    layer1.position = CGPointMake(100, 100);

    layer2 = [CALayer layer];
    layer2.contents = im2.CGImage;
    layer2.bounds = CGRectMake(0, 0, im2.size.width, im2.size.height);
    layer2.position = CGPointMake(300, 300);

    compositingLayer = [CALayer layer];
    compositingLayer.shouldRasterize = YES; //< Here we turn this into a compositing layer.
    compositingLayer.frame = self.bounds;

    /***** Create the layer three *****/
    [compositingLayer addSublayer:layer1];  //< Add first, so it's in back.
    [compositingLayer addSublayer:layer2];  //< Add second, so it's in front.

    // Don't mess with the UIView's layer, it's picky; just add sublayers to it.
    [self.layer addSublayer:compositingLayer];
}

- (IBAction)animate:(id)sender
{
    /* Since we're using CALayers, we can use implicit animation
     * to move and change the opacity.
     * Layer2 is over Layer1, the compositing is partially transparent.
     */
    layer1.position = CGPointMake(200, 200);
    layer2.position = CGPointMake(200, 200);
    compositingLayer.opacity = 0.5;
}
2 голосов
/ 05 апреля 2010

Я думаю, что объединение UIView в UIImageView - ваш лучший выбор, если вы настроены на предоставление этой функции. Кроме того, я не думаю, что сглаживание изображения будет таким сложным, как вы думаете. Взгляните на ответ, приведенный в этом вопросе .

0 голосов
/ 05 апреля 2010

Установите для нижнего UIImageView значение .hidden = YES, затем установите .hidden = NO при настройке анимации с плавным переходом между верхним и нижним UIImageViews.

Когда вам нужно полностью затухать, вы можете установить .alpha = 0.5 на виде контейнера или на вид сверху - это не должно иметь значения. Возможно, в вычислительном отношении более эффективно установить .alpha = 0.5 для самого изображения, но я не знаю достаточно о графическом конвейере на iPhone, чтобы быть уверенным в этом.

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

0 голосов
/ 05 апреля 2010

Один из способов сделать это - добавить ImageViews в UIWindow (контейнер будет поддельным)

...