2010-08-01 3 views
0

Вопрос о двух растровых изображениях поверх друг друга, один из которых является полупрозрачным.Создание прозрачного UIView за подвью на iPhone

У меня есть пользовательский UIView, называемый foo. У меня есть два CGBitmapContext, которые я создал. Они эффективно используются в качестве нестационарных буферов и имеют равные прямоугольные размеры. Я хочу взять два из этих экранов и сложить их один поверх другого. Фон должен быть полупрозрачным, передний план должен быть непрозрачным (но использует clearColor для отображения через фон). Эффект заключается в том, что у вас есть острый передний план с видимостью в фоновом изображении, где передний план не окрашен (clearColor).

CGContextRef background; 
CGContextRef foreground; 

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

Вопрос 1: Правильно ли это? Должен ли я пытаться использовать слои вместо этого? Должен ли я комбинировать растровые изображения, а затем BLT с родительским/корневым UIView? Quesiton 2: Любой образец кода, который может быть предоставлен для выполнения вышеуказанного, оценен!

Спасибо!

ответ

0

Я нашел предыдущую запись StackOverflow, которая была чрезвычайно полезной. Это привело к слиянию двух изображений не через представления, а с использованием двумерных API Quartz. Все еще позволил мне выполнить то, что я хотел.

blend two uiimages based on alpha/transparency of top image

0

UPDATE:

Это абсолютно смешно, я должен был сделать это, потому что должен быть более простой способ, но я в конечном итоге позиционирование двух независимых UIViews один над другим, а затем настройки непрозрачности и альфа соответственно. Это работает.

Я пытаюсь написать новый взгляд прямо сейчас, что делает это правильный путь который выглядит примерно так:

UIView : myview 
    - (subview) UIImageView 
    - (subview) UIImageView 


The code looks something like this... 

@interface customView : UIView 
{ 
    ... 
    UIImageView *foregroundImage; 
    UIImageView *backgroundImage; 
    ... 
} 
@end 

@implementation 

- (void) awakeFromNib 
{ 
    ... 
    self.backgroundColor = [UIColor whiteColor]; 
    self.alpha = 1; 
    self.opaque = YES; 
    self.clearsContextBeforeDrawing = FALSE; 

    [backgroundImage initWithImage:<...>]; 
    backgroundImage.alpha = 0.5; // Yes, this should be 0.5. The background should be a bit lucid 
    backgroundImage.opaque = YES; // I want the white background of the parent UIView to show through 

    [foregroundImage initWithImage:<...>]; 
    foregroundImage.alpha = 1; // Yes, this should be 1. The surrounding space is clear... 
    backgroundImage.opaque = YES; 

    [self addSubview:backgroundImage]; 
    [self addSubview:foregroundImage]; 

    [self bringSubviewToFront:foregroundImage]; 

    [self setNeedsLayout]; 

    [foregroundImage setNeedsDisplay]; 
    [backgroundImage setNeedsDisplay]; 
    [self setNeedsDisplay]; 
    ... 
} 

- (void) drawRect: (CGRect) rect 
{ 
    ... 
    // update the images to latest 
    [backgroundImage setImage:<..new..>]; 
    [foregroundImage setImage:<..new..>]; 

    [backgroundImage setNeedsDisplay]; // necessary? 
    [foregroundImage setNeedsDisplay]; // necessary? 
    [self setNeedsDisplay]; // necessary? 
    ... 
} 
@end 

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

Я знаю, что эти буфера имеют правильные изображения, потому что, если я делаю что-то вроде:

CGImageRef bitmap = CGBitmapContextCreateImage(bufferContext); 
CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0,0,self.bounds.size.width, ...height), bitmap); 
CGImageRelease(bitmap); 

... Я могу см. правильное изображение. UIImageViews, похоже, не хотят обновляться. Их непрозрачность и т. Д. Также установлены соответственно.

Будет продолжать шлифовать, не хочу писать взломать это. Должен быть простой, элегантный способ ...

Любая помощь/руководство оценено.

Смежные вопросы