2011-12-20 3 views
-1

Je veux que, lorsque je roule l'iPad, l'image devient aveugle de haut en bas. L'effet doit être similaire àComment est-ce que je peux rendre aveugle l'effet à une image dans IOS?

http://madrobby.github.com/scriptaculous/combination-effects-demo/ Démonstration d'aveuglement.

Comment puis-je faire cela?

J'ai essayé l'exemple de réflexion d'Apple mais j'ai eu des problèmes de performance puisque je devrais redessiner l'image dans chaque action du gyroscope.

Voici le code:

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
tmp = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"galata2.jpg"]]; 
// Do any additional setup after loading the view, typically from a nib. 
NSUInteger reflectionHeight = imageView1.bounds.size.height * 1; 


imageView1 = [[UIImageView alloc] init]; 
imageView1.image = [UIImage imageNamed:@"galata1.jpg"]; 
[imageView1 sizeToFit]; 
[self.view addSubview:imageView1]; 

imageView2 = [[UIImageView alloc] init]; 
//UIImageView *tmp = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"galata2.jpg"]]; 
imageView2.image = [UIImage imageNamed:@"galata2.jpg"]; 

[imageView2 sizeToFit]; 



[self.view addSubview:imageView2]; 

motionManager = [[CMMotionManager alloc] init]; 
motionManager.gyroUpdateInterval = 1.0/10.0; 
[motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue] 
            withHandler: ^(CMDeviceMotion *motion, NSError *error){ 

             [self  performSelectorOnMainThread:@selector(handleDeviceMotion:) withObject:motion waitUntilDone:YES]; 

            }]; 

} 

////

- (void)handleDeviceMotion:(CMDeviceMotion*)motion{ 
CMAttitude *attitude = motion.attitude; 
int rotateAngle = abs((int)degrees(attitude.roll)); 
//CMRotationRate rotationRate = motion.rotationRate; 
NSLog(@"rotation rate = [Pitch: %f, Roll: %d, Yaw: %f]", degrees(attitude.pitch), abs((int)degrees(attitude.roll)), degrees(attitude.yaw)); 
int section = (int)(rotateAngle/30); 
int x = rotateAngle % 30; 

NSUInteger reflectionHeight = (1024/30)*x; 
NSLog(@"[x = %d]", reflectionHeight); 
imageView2.image = [self reflectedImage:tmp withHeight:reflectionHeight]; 
} 

////

- (UIImage *)reflectedImage:(UIImageView *)fromImage withHeight:(NSUInteger)height 
{ 
if(height == 0) 
    return nil;  


// create a bitmap graphics context the size of the image 
CGContextRef mainViewContentContext = MyCreateBitmapContext(fromImage.bounds.size.width, fromImage.bounds.size.height); 


// create a 2 bit CGImage containing a gradient that will be used for masking the 
// main view content to create the 'fade' of the reflection. The CGImageCreateWithMask 
// function will stretch the bitmap image as required, so we can create a 1 pixel wide gradient 
CGImageRef gradientMaskImage = CreateGradientImage(1, kImageHeight); 

// create an image by masking the bitmap of the mainView content with the gradient view 
// then release the pre-masked content bitmap and the gradient bitmap 
CGContextClipToMask(mainViewContentContext, CGRectMake(0.0, 0.0, fromImage.bounds.size.width,height), gradientMaskImage); 
CGImageRelease(gradientMaskImage); 

// In order to grab the part of the image that we want to render, we move the context origin to the 
// height of the image that we want to capture, then we flip the context so that the image draws upside down. 
//CGContextTranslateCTM(mainViewContentContext, 0.0,0.0); 
//CGContextScaleCTM(mainViewContentContext, 1.0, -1.0); 


// draw the image into the bitmap context 
CGContextDrawImage(mainViewContentContext, CGRectMake(0, 0, fromImage.bounds.size.width, fromImage.bounds.size.height), fromImage.image.CGImage); 

// create CGImageRef of the main view bitmap content, and then release that bitmap context 
CGImageRef reflectionImage = CGBitmapContextCreateImage(mainViewContentContext); 
CGContextRelease(mainViewContentContext); 

// convert the finished reflection image to a UIImage 
UIImage *theImage = [UIImage imageWithCGImage:reflectionImage]; 

// image is retained by the property setting above, so we can release the original 
CGImageRelease(reflectionImage); 

return theImage; 
} 
+0

Je ne sais pas ce que vous avez fait jusqu'à présent - mais avez-vous * regardé * la documentation Core Animation? – Abizern

Répondre

1

Une façon de faire est d'utiliser une autre vue de couverture que change progressivement la hauteur par l'animation;

Si vous avez une vue appelée theView que vous voulez couvrir, essayer quelque chose comme ça pour révéler theView sous une vue de la couverture:

UIView *coverView = [UIView alloc] initWithFrame:theView.frame]; 
coverView.backgroundcolor = [UIColor whiteColor]; 
[theView.superView addSubView:coverView]; // this covers theView, adding it to the same view that the view is contained in; 
CGRect newFrame = theView.frame; 
newFrame.size.height = 0; 
newFrame.origin.y = theView.origin.y + theView.size.height; 
[UIView animateWithDuration:1.5 
         delay: 0.0 
        options: UIViewAnimationOptionRepeat 
       animations:^{ 
        coverView.frame = newFrame; 
       } 
       completion:nil 
       ]; 

Cela devrait couvrir la vue et révéler en changeant le cadre ov le couvercle, le déplaçant vers le bas tout en changeant la hauteur.

Je n'ai pas essayé le code, mais c'est une direction que vous pouvez prendre pour créer l'effet aveugle. J'ai souvent utilisé un code similaire, et il est très facile de travailler avec. En outre, il ne nécessite pas de connaître l'animation de base.

+0

mais c'est une animation. Je ne veux pas animer. Ce que je veux, c'est quand je roule l'appareil, avec l'aide du gyroscope, calculer une hauteur, et redessiner l'image avec le masque. – Burak

+0

Je suis vraiment désolé. La seule chose que je veux est de masquer une image avec un dégradé alpha, et de changer la hauteur de ce dégradé avec l'action de roulis. Ce sera donc comme une photo lenticulaire. – Burak

+0

Vous voudrez peut-être modifier votre question avec quelques précisions. – Jim

Questions connexes