drawRect в подклассе UIView не обновляет изображение

У меня есть подкласс UIView, который я хотел бы использовать для рисования изображений с разными режимами наложения.

код:

@implementation CompositeImageView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}

-(void)setBlendMode:(CGBlendMode) composite
{
    blender = composite;
}

-(void)setImage:(UIImage*) img
{
    image = img;
}

- (void)drawRect:(CGRect)rect
{
    NSLog(@"it draws");
    CGContextRef c = UIGraphicsGetCurrentContext();
    CGContextSetBlendMode(c, blender);
    CGContextDrawImage(c, rect, image.CGImage);
}

@end

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

[testImage setImage:[UIImage imageNamed:@"Prayer_Background_Paid"]];
[testImage setBlendMode:kCGBlendModeColor];
[testImage setNeedsDisplay];

Я использую конструктор интерфейса для размещения большого прямоугольного UIView, а затем устанавливаю его класс на CompositeImageView. Тем не менее, он по-прежнему отображается в виде большого белого квадрата. Даже если я закомментирую все внутри drawRect, он все равно рисует белый квадрат. Однако он вызывает drawRect, потому что «он рисует» регистрируется.


person Nyth    schedule 28.04.2012    source источник
comment
Вы уверены, что ваше изображение не nil (возможно, опечатка в имени файла)?   -  person omz    schedule 28.04.2012
comment
да. Я также попробовал несколько других изображений в проекте. Если что-то не так с тем, как я получаю / рисую изображение, я понятия не имею, что может быть не так - поэтому я разместил здесь. (не уверен, что с отрицательными голосами)   -  person Nyth    schedule 07.05.2012
comment
Удалось ли вам это сделать? Я пытаюсь сделать то же самое прямо сейчас.   -  person Zoltán Matók    schedule 27.07.2014
comment
Не так, как я планировал изначально. Представления рисуются в drawRect, а ТОГДА компонуются на графическом процессоре. В результате он не может сливаться с содержимым под изображением. Возможно, вы сможете добиться чего-то подобного с помощью UIVisualEffectsView но я тоже не знаком с внутренним устройством этого парня. Если вы просто пытаетесь нарисовать изображение поверх цвета фона или другого изображения, вы можете просто нарисовать это содержимое перед вызовом CGContextSetBlendMode ().   -  person Nyth    schedule 27.07.2014
comment
Если вам абсолютно нужен эффект, вы можете сделать снимок представленных ниже представлений и нарисовать это изображение с правильным смещением до рисования смешанного изображения, но это начинает очень быстро усложняться, если вы хотите, чтобы он работал в режиме реального времени. Однако вы можете подделать это довольно хорошо, если фоновое содержимое не меняется слишком часто.   -  person Nyth    schedule 27.07.2014


Ответы (1)


Вы уверены, что kCGBlendModeColor - это то, что вам нужно? Из документа Apple:

Использует значения яркости фона со значениями оттенка и насыщенности исходного изображения.

Кажется, что если бы это был белый фон, смешанное изображение также выглядело бы белым.

person Jesse Gumpo    schedule 28.04.2012
comment
Color был лишь одним из них, который я пробовал - как я уже упоминал, я попытался полностью закомментировать метод drawRect, но белый прямоугольник все еще появился. - person Nyth; 28.04.2012
comment
попробуйте установить self.backgroundColor = [UIColor clearColor]; в init. - person Jesse Gumpo; 28.04.2012
comment
установка прозрачного цвета фона заставила его вообще не рисовать, хотя он все еще вызывает метод drawRect ... - person Nyth; 28.04.2012
comment
На самом деле, когда я вызываю [testImage setbackgroundColor: [UIColor clearColor]], он ничего не рисует. Когда я помещаю [self setBackgroundColor ...] в метод drawRect, он все равно рисует белый квадрат. - person Nyth; 28.04.2012