Animar UIView para doblar una mitad en la otra mitad

Tengo el siguiente problema. Quiero escribir un método con el que pueda doblar la mitad de una UIView en la otra mitad.

El algorithm está claro para mí (al less así lo creo, pero tal vez me olvidé algo).

  1. Crear una image renderizada de UIView
  2. dividirlo dependiendo de qué mitad quiero doblar sobre el otro
  3. Agregue las mitades correspondientes de la image renderizada a las capas correspondientes.
  4. agregue las dos capas a un reproductor de background con background blanco y sin contenido (solo está ahí para hacer un background blanco para cubrir la capa original de la vista)
  5. agregue el editor de background a la capa de vistas
  6. establecer la transformación para la capa de plegado
  7. comenzar la animation

¡Debería funcionar, pero no funciona! Y no tengo idea de por qué. Significado de la palabra

Aquí está el código fuente del método:

-(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 rendenetworking 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"]; } 

Si alguien tiene una idea de por qué no funciona, estaría muy contento si pudiera ayudar. Busqué en google casi un día y leí muchas muestras pero no puedo encontrar el error. También busqué en AFKPageFLipper, que es un gran ejemplo para esta tarea, pero desafortunadamente no me ayudó a averiguar cuál es el problema con mi código.

Espero que alguien pueda ayudarme.

Eche un vistazo a estos dos proyectos que incluyen el efecto que está tratando de crear:

https://github.com/blommegard/SBTickerView

https://github.com/raweng/FlipView

debería ser

 CALayer *lay_closingImageHalf = [CALayer layer]; CALayer *lay_fixedImageHalf = [CALayer layer]; 

en lugar de

 CALayer *lay_closingImageHalf; CALayer *lay_fixedImageHalf; 

al less.

También debe configurar frameworks de lay_closingImageHalf y lay_fixedImageHalf

 [lay_closingImageHalf setFrame:rect_closingImageHalf]; [lay_fixedImageHalf setFrame:rect_fixedImageHalf]; 

y aún su animation no se pliega … ¿Estás seguro de que es tu código?