title: Animate UIView to fold one half onto the other half
body: <p>I have the following problem.
  I want to write a method with which i can fold one half of a UIView onto the other half.</p>
  
  <p>The algorithm is clear to me (at least i think so, but maybe i forgot something).</p>
  
  <ol>
  <li>Create a rendered image of the UIView</li>
  <li>split it depending on which half i want to fold onto the other</li>
  <li>add the corresponding halfs of the rendered image to the corresponding layers</li>
  <li>add the two layers to a backgroundlayer with white background and no contents (it is just there to make a white background to cover up the original layer of the view)</li>
  <li>add the backgroundlayer to the views layer</li>
  <li>set the transform for the folding layer</li>
  <li>start the animation</li>
  </ol>
  
  <p>Should work, but doesn't! And I have no idea why. :(</p>
  
  <p>Here is the sourcecode of the Method:</p>
  
  <pre><code>-(void)foldView:(UIView *) view withDuration: (NSTimeInterval) duration toSide: (NSString*) side withReverse: (bool) reverse andRepeatCount:(float) repeatCount
  {
      //create Screenshot from view to fold
      UIGraphicsBeginImageContext(view.bounds.size);
      [view.layer renderInContext:UIGraphicsGetCurrentContext()];
      UIImage *img_view = UIGraphicsGetImageFromCurrentImageContext();
      UIGraphicsEndImageContext();
  
      //Bildausschnitte festlegen
      CGRect rect_closingImageHalf = view.bounds;    
      CGRect rect_fixedImageHalf = view.bounds;    
  
      CGPoint pt_anchorOpeningImageHalf;
      CGPoint pt_anchorFixedImageHalf;
  
      CATransform3D transform;
  
      CALayer *lay_closingImageHalf;
      CALayer *lay_fixedImageHalf;
      lay_fixedImageHalf.masksToBounds = YES;
      lay_closingImageHalf.masksToBounds = YES;
      //get white backside of layer which folds
      lay_closingImageHalf.doubleSided = NO;
  
  
      //white backgroundlayer to hide the layer of the image
      CALayer *backgroundAnimationLayer = [CALayer layer];
      backgroundAnimationLayer.frame = view.frame;
      backgroundAnimationLayer.backgroundColor = [[UIColor whiteColor] CGColor];
  
      //determine direction in which to fold    
      if ([side isEqualToString:k_side_vonLinks]) 
      {
          rect_closingImageHalf = CGRectMake(0, 0, img_view.size.width / 2, img_view.size.height);
          rect_fixedImageHalf = CGRectMake(img_view.size.width / 2, 0, img_view.size.width / 2, img_view.size.height);
  
          pt_anchorOpeningImageHalf = CGPointMake(1.0, 0.5);        
          pt_anchorFixedImageHalf = CGPointMake(0.5, 0.5);
  
          transform = CATransform3DMakeRotation(M_PI, 0, 1.0, 0);
      }
      else if([side isEqualToString:k_side_vonRechts])
      {
          rect_closingImageHalf = CGRectMake(img_view.size.width / 2, 0, img_view.size.width / 2, img_view.size.height);
          rect_fixedImageHalf = CGRectMake(0, 0, img_view.size.width / 2, img_view.size.height);
  
          pt_anchorOpeningImageHalf = CGPointMake(0.0, 0.5);
          pt_anchorFixedImageHalf = CGPointMake(0.5, 0.5);   
  
          transform = CATransform3DMakeRotation(M_PI, 0, 1.0, 0);
      }
      else if([side isEqualToString:k_side_vonOben])
      {
          rect_closingImageHalf = CGRectMake(0, 0, img_view.size.width, img_view.size.height / 2);
          rect_fixedImageHalf = CGRectMake(0, img_view.size.height / 2, img_view.size.width, img_view.size.height / 2);
  
          pt_anchorOpeningImageHalf = CGPointMake(0.5, 1.0);
          pt_anchorFixedImageHalf = CGPointMake(0.5, 0.5);
  
          transform = CATransform3DMakeRotation(M_PI, 1.0, 0, 0);
      }
      else if([side isEqualToString:k_side_vonUnten])
      {
          rect_closingImageHalf = CGRectMake(0, img_view.size.height / 2, img_view.size.width, img_view.size.height / 2);
          rect_fixedImageHalf = CGRectMake(0, 0, img_view.size.width, img_view.size.height / 2);
  
          pt_anchorOpeningImageHalf = CGPointMake(0.5, 0.0);
          pt_anchorFixedImageHalf = CGPointMake(0.5, 0.5);
  
          transform = CATransform3DMakeRotation(M_PI, 1.0, 0, 0);
      }
  
      CGImageRef img_closingHalf = CGImageCreateWithImageInRect( [img_view CGImage], rect_closingImageHalf);
      CGImageRef img_fixedHalf = CGImageCreateWithImageInRect( [img_view CGImage], rect_fixedImageHalf);    
  
      lay_closingImageHalf.anchorPoint = pt_anchorOpeningImageHalf;
      lay_fixedImageHalf.anchorPoint = pt_anchorFixedImageHalf;
  
  
      //add the rendered image of the view to the backgroundLayer
      [backgroundAnimationLayer addSublayer:lay_fixedImageHalf];
      [backgroundAnimationLayer addSublayer:lay_closingImageHalf];
      lay_closingImageHalf.contents = (__bridge id)img_closingHalf;
      lay_fixedImageHalf.contents = (__bridge id)img_fixedHalf;
  
  
      [view.layer addSublayer:backgroundAnimationLayer];
  
      //add perspective
      transform.m34 = 1.0f / 2500.0f;
  
      //animate the folding of the layer
      CABasicAnimation *flipAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];
      flipAnimation.toValue = [NSValue valueWithCATransform3D:transform];
      flipAnimation.duration = duration;
      flipAnimation.autoreverses = reverse;
      flipAnimation.repeatCount = repeatCount;
      flipAnimation.delegate = self;
      flipAnimation.removedOnCompletion = NO;
      flipAnimation.fillMode = kCAFillModeForwards;
  
      [backgroundAnimationLayer addAnimation:flipAnimation forKey:@"fold"];
  }
  </code></pre>
  
  <p>If someone of you has an idea why it doesn't work i would be very glad if he can help.
  I googled almost a day and read many samples but i cannot find the mistake.
  I also looked into <a href="https://github.com/mtabini/AFKPageFlipper" rel="nofollow">AFKPageFLipper</a> which is a really great example for this task, but unfortunately it didn't help me to find out whats wrong with my code.</p>
  
  <p>Hope that someone can help me.</p>