Создание прозрачного UIView за подпредставлением на iPhone - PullRequest
0 голосов
/ 01 августа 2010

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

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

CGContextRef background;
CGContextRef foreground;

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

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

Спасибо!

Ответы [ 2 ]

0 голосов
/ 02 августа 2010

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

смешать два изображения на основе альфа / прозрачности верхнего изображения

0 голосов
/ 02 августа 2010

ОБНОВЛЕНИЕ:

Совершенно нелепо, что я должен был это сделать, потому что должен быть более простой способ, но я закончил тем, что расположил два независимых 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 не хотят обновляться.Их непрозрачность и т. Д. Также устанавливается соответствующим образом.

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

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

...