2012-09-20 3 views
1

Comment créer un reflet d'UIImage sans utiliser UIImageView? J'ai vu le code pomme pour la réflexion en utilisant deux images, mais je ne veux pas ajouter imageview dans mon application, je veux juste l'image entière de l'image originale et l'image réfléchie. Est-ce que n'importe quel corps sait comment faire cela.Réflexion de UIImage sans UIImageView

Répondre

1

Ceci est de UIImage + FX.m, créé par Nick Lockwood

UIImage * processedImage = //here your image 
processedImage = [processedImage imageWithReflectionWithScale:0.15f 
                      gap:10.0f 
                     alpha:0.305f]; 

échelle est la taille de la réflexion, l'écart de la distance entre l'image et la réflexion, et l'alpha alpha de la réflexion

- (UIImage *)imageWithReflectionWithScale:(CGFloat)scale gap:(CGFloat)gap alpha:(CGFloat)alpha 
{ 
    //get reflected image 
    UIImage *reflection = [self reflectedImageWithScale:scale]; 
    CGFloat reflectionOffset = reflection.size.height + gap; 

    //create drawing context 
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(self.size.width, self.size.height + reflectionOffset * 2.0f), NO, 0.0f); 

    //draw reflection 
    [reflection drawAtPoint:CGPointMake(0.0f, reflectionOffset + self.size.height + gap) blendMode:kCGBlendModeNormal alpha:alpha]; 

    //draw image 
    [self drawAtPoint:CGPointMake(0.0f, reflectionOffset)]; 

    //capture resultant image 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    //return image 
    return image; 
} 

et

- (UIImage *)reflectedImageWithScale:(CGFloat)scale 
{ 
    //get reflection dimensions 
    CGFloat height = ceil(self.size.height * scale); 
    CGSize size = CGSizeMake(self.size.width, height); 
    CGRect bounds = CGRectMake(0.0f, 0.0f, size.width, size.height); 

    //create drawing context 
    UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    //clip to gradient 
    CGContextClipToMask(context, bounds, [[self class] gradientMask]); 

    //draw reflected image 
    CGContextScaleCTM(context, 1.0f, -1.0f); 
    CGContextTranslateCTM(context, 0.0f, -self.size.height); 
    [self drawInRect:CGRectMake(0.0f, 0.0f, self.size.width, self.size.height)]; 

    //capture resultant image 
    UIImage *reflection = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    //return reflection image 
    return reflection; 
} 

gradientMask

+ (CGImageRef)gradientMask 
{ 
    static CGImageRef sharedMask = NULL; 
    if (sharedMask == NULL) 
    { 
     //create gradient mask 
     UIGraphicsBeginImageContextWithOptions(CGSizeMake(1, 256), YES, 0.0); 
     CGContextRef gradientContext = UIGraphicsGetCurrentContext(); 
     CGFloat colors[] = {0.0, 1.0, 1.0, 1.0}; 
     CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); 
     CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, colors, NULL, 2); 
     CGPoint gradientStartPoint = CGPointMake(0, 0); 
     CGPoint gradientEndPoint = CGPointMake(0, 256); 
     CGContextDrawLinearGradient(gradientContext, gradient, gradientStartPoint, 
            gradientEndPoint, kCGGradientDrawsAfterEndLocation); 
     sharedMask = CGBitmapContextCreateImage(gradientContext); 
     CGGradientRelease(gradient); 
     CGColorSpaceRelease(colorSpace); 
     UIGraphicsEndImageContext(); 
    } 
    return sharedMask; 
} 

renvoie l'image avec la réflexion.

+0

Qu'est-ce que [[self class] gradientMask]? Et que retournera le code ci-dessus? Une image réfléchie ou une image entière (originale + réfléchie)? –

+0

a ajouté la méthode gradientMask sur la réponse. L'imageWithReflectionWithScale renvoie l'original + reflété, l'image reflétéeImageWithScale renvoie uniquement la réflexion. – jcesarmobile

+0

Comment changer la hauteur de l'image réfléchie? Je veux dessiner l'image originale en tant que demi-taille de la vue et l'autre moitié devrait être l'image reflétée ci-dessous. Même si je mets une valeur alfa à 1 de l'image réfléchie, elle montre une image opaque en bas. –

0

Vous pouvez rendre l'image et sa réflexion dans un contexte graphique, puis obtenir un CGImage à partir du contexte et à partir de là un UIImage. Mais la question est: pourquoi ne pas utiliser deux vues? Pourquoi pensez-vous que c'est un problème ou une limitation?

1

J'ai écrit un blog post awhile ago qui utilise CAReplicatorLayer d'une vue. Il est vraiment conçu pour gérer les mises à jour dynamiques d'une vue avec réflexion, mais je pense que cela fonctionnerait aussi bien pour ce que vous voulez faire.

Questions connexes