2013-06-12 2 views
0

En ce moment, je travaille sur une application de radio en streaming pour un ami pour iPhone et iPad. Lors de la mise en œuvre de mes conceptions dans le code, j'ai frappé un bug drôle (?). Je souhaite afficher la pochette de l'album en arrière-plan et en masquant cela, en utilisant cet exemple tutorial.Retina image gonfle 4 fois dans Xcode

Cela fonctionne très bien sur les iPhones basse résolution, mais dès que je l'ai testé sur un iPhone 4 & 5 (appareils de test et émulateur) l'image est montrée 4x aussi grande qu'elle devrait l'être.

enter image description here

Il doit afficher comme ceci: enter image description here

J'ai ajouté les images normales, ainsi que @ 2x de, qui viennent à 320x320 & 640x640 (@ 2x) La dernière chose que je devrait ajouter, cela fonctionne très bien si je ne masque pas les images. Mais je crois que le masque fonctionne (s'il ne serait pas gonflé 4x). Alors probablement, le code grossit l'image deux fois, au lieu d'une seule fois.

Pour ajouter un peu de mon code:

albumArt = [[UIImageView alloc] init]; 
[albumArt setFrame:CGRectMake(0, 0, 320, 320)]; 
UIImage *image = [UIImage imageNamed:@"testPopArt.png"]; 
UIImage *mask = [UIImage imageNamed:@"popArtMask.png"]; 
finalAlmbumArt = [self maskImage:image withMask:mask]; 
[albumArt setBackgroundColor:[UIColor colorWithPatternImage:finalAlmbumArt]]; 
[appBackground addSubview:albumArt]; 
+0

Pouvez-vous poster les tailles des images (normal et rétine). – rckoenes

+0

Ajouté à l'explication (320x320 & 640x640). Les masques sont exactement de la même taille btw! ;) –

Répondre

1

Vous neet à dire UIImage l'échelle du:

- (UIImage*) maskImage:(UIImage *)image withMask:(UIImage *)maskImage { 

    CGImageRef maskRef = maskImage.CGImage; 

    CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), 
             CGImageGetHeight(maskRef), 
             CGImageGetBitsPerComponent(maskRef), 
             CGImageGetBitsPerPixel(maskRef), 
             CGImageGetBytesPerRow(maskRef), 
             CGImageGetDataProvider(maskRef), NULL, false); 

    CGImageRef masked = CGImageCreateWithMask([image CGImage], mask); 
    CGFloat scale = [UIScreen mainScreen].scale; 
    return [UIImage imageWithCGImage:masked scale:scale orientation:UIImageOrientationDown]; 

} 

Vous pourriez probablement obtenir aussi l'effet avec un CAGradientLayer afin que vous n'ayez pas à faire une nouvelle image. Ce sera un peu moins gourmand en CPU.

+0

Je vois, totalement regardé ça! Merci, apprécié. Fonctionne comme un charme –