UIImageView subclasse duplicar a imagem

votos
1

Eu estou trabalhando em uma subclasse de UIImageView e uma das coisas que exigem é quando o objeto é initalised com o initWithImage: Mensagem de uma 'cópia' é criado.

Devo ser confuso alguma coisa, porque eu não posso ver o que não está funcionando aqui ..

- (id)initWithImage:(UIImage *)image {
[image retain];
if (self = [super initWithImage:image]) {

    if (!maskImage) {
        maskImage = [UIImage imageWithCGImage:[image CGImage]];
        if (maskImage != nil) {
            NSLog(@Made mask image);
        } else {
            NSLog(@Failed);
        }
        //maskImage = [UIImage imageNamed:@image.png];
    }
}

[image release];
return self;
}

Não há erros quando eu construir este eo MaskImage parece ser criados (i não recebem a mensagem de falha). No entanto, se eu remover o comentário da linha de alocação de um png ele funciona.

o que estou perdendo?

Obrigado!

Publicado 19/05/2009 em 20:54
fonte usuário
Em outras línguas...                            


3 respostas

votos
1

Você deve manter a imagem criada, no exemplo como este:

- (id)initWithImage:(UIImage *)image {
    if (self = [super initWithImage:image]) {
        if (!maskImage) {
                maskImage = [[UIImage imageWithCGImage:[image CGImage]] retain];
                if (maskImage != nil) {                
                        NSLog(@"Made mask image");
                } else {
                        NSLog(@"Failed");
                }
        }
    }
    return self;
}
Respondeu 13/06/2009 em 10:31
fonte usuário

votos
0

Primeiro, você deve definir MaskImage a zero, para ter certeza que não é lixo:

self.maskImage=nil;

Isso pode estragar a sua linha (se não for agora, então mais tarde):

if(!imaskImage)

Então, para fazer uma cópia, basta implementar NSCopying em uma subclasse UIImage. É fácil de fazer. Depois, você pode digitar:

maskImage = [image copy];

Alternativamente, você pode converter a imagem em dados, arquivo, em seguida, desarquivar, em seguida, converter de volta para um UIImage. Isto dá-lhe uma cópia completa da imagem. É um pouco mais complexo, mas é o mesmo método usado para fazer cópias de profundidade de um gráfico de objeto.

Respondeu 19/05/2009 em 23:53
fonte usuário

votos
0

Tente isto. Deveria trabalhar.

- (id)initWithImage:(NSString *)image {
if (self = [super initWithImage:image]) {

        if (!maskImage) {
                img = [UIImage imageNamed:image];
                maskImage = CGImageRetain(img.CGImage);
                if (maskImage != nil) {
                        NSLog(@"Made mask image");
                } else {
                        NSLog(@"Failed");
                }
        }
}

return self;
}
  1. Alterar
    • passar NSString em vez de imagem
    • não há necessidade de manter a imagem / release
    • precisa definir img, MaskImage em .h
    • MaskImage em .h deveria ter reter propriedade definida em @property (por exemplo @property (nonatomic, reter))
Respondeu 19/05/2009 em 22:26
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more