玩UIView动画和UIView翻转乐趣

时间:2011-12-25 03:33:11

标签: ios uiview uiviewanimation catransform3d

(我为长篇文章道歉)为了让我的AQGridView更加生动,附加的代码将选定的单元格复制到UIView中,然后动画化该视图以扩展以填充屏幕,然后将所述视图转换为看起来像一个全屏幕封面动画。随意重用,但这不是我的问题。我的问题是Landscape的动画,它必须是不同的。我希望将我的单元格视图设置为屏幕右半部分的动画并展开以填充屏幕的右半部分(已经完成),然后让它在屏幕左侧进行y翻转旋转。锚点在CGPointMake(0.5,0.5);不起作用,也没有将翻译x值设置为屏幕的一半再返回,它只是执行,然后飞离屏幕! HELP !!

编辑:(代码现在正在工作,感谢我没有意识到我已经将新UIView's添加到self.navigationController.view属性,所以只需要渲染并翻转它,不翻译需要!) 工作代码:

if(UIInterfaceOrientationIsPortrait(viewController.interfaceOrientation)) {
            self.view.userInteractionEnabled = NO;

            [self.navigationController.view addSubview:viewForCopy];
            [self.navigationController.view bringSubviewToFront:viewForCopy];
            [viewForCopy setFrame:CGRectMake([_gridView rectForItemAtIndex:index].origin.x, [_gridView rectForItemAtIndex:index].origin.y + 65, [_gridView rectForItemAtIndex:index].size.width, [_gridView rectForItemAtIndex:index].size.height)];
            [viewForCopy setAlpha:1.0f];

            [[_gridView cellForItemAtIndex:index] setAlpha:0.0f];

            [UIView animateWithDuration:1.5f
                                  delay:0.0f
                                options:UIViewAnimationCurveEaseInOut
                             animations:^{
                                 [self.navigationController.navigationBar setAlpha:0.0f];
                                 [newShadow removeFromSuperlayer];
                                 [viewForCopy setFrame:CGRectMake(-158, 10, self.view.bounds.size.width * 1.55, self.view.bounds.size.height * 1.25)];
                                 [self.navigationController.navigationBar setAlpha:0.0f];  
                             } 
                             completion:^(BOOL finished) {
                                 [UIView animateWithDuration:2.0f
                                                       delay:0.0f
                                                     options:UIViewAnimationCurveEaseInOut
                                                  animations:^{
                                                      [viewForCopy setAlpha:0.0f];
                                                      CATransform3D _3Dt = CATransform3DIdentity;
                                                      _3Dt = CATransform3DTranslate(_3Dt, viewForCopy.frame.size.width * -1, 0, 0);
                                                      _3Dt = CATransform3DRotate(_3Dt, M_PI / -2.0f, 0.0f, 0.1f, 0.0f);  
                                                      _3Dt.m34 = 1.0f / 500.0f;
                                                      _3Dt = CATransform3DTranslate(_3Dt, viewForCopy.frame.size.width, 0, 0);
                                                      viewForCopy.layer.transform = _3Dt;
                                                      [UIView setAnimationTransition:UIViewAnimationTransitionNone forView:self.navigationController.view cache:YES];
                                                      [self.navigationController pushViewController:viewController animated:NO];

                                                  } 
                                                  completion:^(BOOL finished) {
                                                  }];
                                 [[_gridView cellForItemAtIndex:index] setAlpha:1.0f];
                                 [self.navigationController.view sendSubviewToBack:viewForCopy];

                             }];
        }
             else if(UIInterfaceOrientationIsLandscape(viewController.interfaceOrientation)){
                 UIView *viewforCopyLandscape2 = [[[UIView alloc]initWithFrame:CGRectMake([_gridView rectForItemAtIndex:index].origin.x, [_gridView rectForItemAtIndex:index].origin.y + 65, [_gridView rectForItemAtIndex:index].size.width, [_gridView rectForItemAtIndex:index].size.height)]autorelease];
                 viewforCopyLandscape2.backgroundColor = [UIColor whiteColor];
                 viewforCopyLandscape2.alpha = 0.0f;

                 [self.navigationController.view addSubview:viewforCopyLandscape2];
                 [self.navigationController.view bringSubviewToFront:viewforCopyLandscape2];
                 [self.navigationController.view addSubview:viewForCopy];
                 [self.navigationController.view bringSubviewToFront:viewForCopy];

                 [newShadow removeFromSuperlayer];

                 [viewForCopy setFrame:CGRectMake([_gridView rectForItemAtIndex:index].origin.x, [_gridView rectForItemAtIndex:index].origin.y + 65, [_gridView rectForItemAtIndex:index].size.width, [_gridView rectForItemAtIndex:index].size.height)];

                 [[_gridView cellForItemAtIndex:index] setAlpha:0.0f];

                 self.view.userInteractionEnabled = NO;

                 [UIView animateWithDuration:1.5f
                                       delay:0.0f
                                     options:UIViewAnimationCurveEaseInOut
                                  animations:^{
                                      [viewforCopyLandscape2 setFrame:CGRectMake(0, 20, self.view.bounds.size.width/2, self.view.bounds.size.height)];
                                      [viewForCopy setFrame:CGRectMake(407, 10, self.view.bounds.size.width * .78, self.view.bounds.size.height * 1.25)];
                                      [self.navigationController.navigationBar setAlpha:0.0f];  
                                      viewforCopyLandscape2.alpha = 1.0f;
                                  } 
                                  completion:^(BOOL finished) {

                                      UIView *viewForCopyLandscape = [[[UIView alloc]initWithFrame:CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.bounds.size.width, self.view.bounds.size.height)]autorelease];
                                      UIGraphicsBeginImageContext(CGSizeMake(self.view.bounds.size.width, self.view.bounds.size.height));
                                      [self.navigationController.view.layer renderInContext:UIGraphicsGetCurrentContext()];
                                      UIImageView *viewImage = [[[UIImageView alloc]initWithImage:UIGraphicsGetImageFromCurrentImageContext()]autorelease];
                                      UIGraphicsEndImageContext();
                                      viewForCopyLandscape = viewImage;
                                      [self.navigationController.view addSubview:viewForCopyLandscape];
                                      [self.navigationController.view bringSubviewToFront:viewForCopyLandscape];

                                      [viewForCopy setAlpha:0.0f];
                                      [UIView animateWithDuration:2.0f
                                                            delay:0.0f
                                                          options:UIViewAnimationCurveEaseInOut
                                                       animations:^{

                                                           CATransform3D transform = CATransform3DMakeRotation(-M_PI / 1.1, 0.0, 1.0, 0.0);
                                                           transform.m34 = 1.0f / 2500.0f;
                                                           viewForCopyLandscape.layer.transform = transform;

                                                           [self.navigationController.view sendSubviewToBack:viewForCopy];
                                                           [UIView setAnimationTransition:UIViewAnimationTransitionNone forView:self.navigationController.view cache:YES];
                                                           [self.navigationController pushViewController:viewController animated:NO];
                                                           [viewforCopyLandscape2 removeFromSuperview];

                                                       }           
                                                       completion:^(BOOL finished) {
                                                           [[_gridView cellForItemAtIndex:index] setAlpha:1.0f];
                                                           [viewForCopy removeFromSuperview];
                                                           [UIView animateWithDuration:1.00 animations:^ {
                                                               [viewForCopyLandscape setAlpha:0.0f];

                                                           }];
                                                       }];
                                  }];
}

1 个答案:

答案 0 :(得分:0)

代码现在正在工作,感谢我没有意识到我已经将新的UIView添加到self.navigationController.view属性中,所以只需要渲染并翻转它,不需要翻译!)

if(UIInterfaceOrientationIsPortrait(viewController.interfaceOrientation)) {
            self.view.userInteractionEnabled = NO;

            [self.navigationController.view addSubview:viewForCopy];
            [self.navigationController.view bringSubviewToFront:viewForCopy];
            [viewForCopy setFrame:CGRectMake([_gridView rectForItemAtIndex:index].origin.x, [_gridView rectForItemAtIndex:index].origin.y + 65, [_gridView rectForItemAtIndex:index].size.width, [_gridView rectForItemAtIndex:index].size.height)];
            [viewForCopy setAlpha:1.0f];

            [[_gridView cellForItemAtIndex:index] setAlpha:0.0f];

            [UIView animateWithDuration:1.5f
                                  delay:0.0f
                                options:UIViewAnimationCurveEaseInOut
                             animations:^{
                                 [self.navigationController.navigationBar setAlpha:0.0f];
                                 [newShadow removeFromSuperlayer];
                                 [viewForCopy setFrame:CGRectMake(-158, 10, self.view.bounds.size.width * 1.55, self.view.bounds.size.height * 1.25)];
                                 [self.navigationController.navigationBar setAlpha:0.0f];  
                             } 
                             completion:^(BOOL finished) {
                                 [UIView animateWithDuration:2.0f
                                                       delay:0.0f
                                                     options:UIViewAnimationCurveEaseInOut
                                                  animations:^{
                                                      [viewForCopy setAlpha:0.0f];
                                                      CATransform3D _3Dt = CATransform3DIdentity;
                                                      _3Dt = CATransform3DTranslate(_3Dt, viewForCopy.frame.size.width * -1, 0, 0);
                                                      _3Dt = CATransform3DRotate(_3Dt, M_PI / -2.0f, 0.0f, 0.1f, 0.0f);  
                                                      _3Dt.m34 = 1.0f / 500.0f;
                                                      _3Dt = CATransform3DTranslate(_3Dt, viewForCopy.frame.size.width, 0, 0);
                                                      viewForCopy.layer.transform = _3Dt;
                                                      [UIView setAnimationTransition:UIViewAnimationTransitionNone forView:self.navigationController.view cache:YES];
                                                      [self.navigationController pushViewController:viewController animated:NO];

                                                  } 
                                                  completion:^(BOOL finished) {
                                                  }];
                                 [[_gridView cellForItemAtIndex:index] setAlpha:1.0f];
                                 [self.navigationController.view sendSubviewToBack:viewForCopy];

                             }];
        }
             else if(UIInterfaceOrientationIsLandscape(viewController.interfaceOrientation)){
                 UIView *viewforCopyLandscape2 = [[[UIView alloc]initWithFrame:CGRectMake([_gridView rectForItemAtIndex:index].origin.x, [_gridView rectForItemAtIndex:index].origin.y + 65, [_gridView rectForItemAtIndex:index].size.width, [_gridView rectForItemAtIndex:index].size.height)]autorelease];
                 viewforCopyLandscape2.backgroundColor = [UIColor whiteColor];
                 viewforCopyLandscape2.alpha = 0.0f;

                 [self.navigationController.view addSubview:viewforCopyLandscape2];
                 [self.navigationController.view bringSubviewToFront:viewforCopyLandscape2];
                 [self.navigationController.view addSubview:viewForCopy];
                 [self.navigationController.view bringSubviewToFront:viewForCopy];

                 [newShadow removeFromSuperlayer];

                 [viewForCopy setFrame:CGRectMake([_gridView rectForItemAtIndex:index].origin.x, [_gridView rectForItemAtIndex:index].origin.y + 65, [_gridView rectForItemAtIndex:index].size.width, [_gridView rectForItemAtIndex:index].size.height)];

                 [[_gridView cellForItemAtIndex:index] setAlpha:0.0f];

                 self.view.userInteractionEnabled = NO;

                 [UIView animateWithDuration:1.5f
                                       delay:0.0f
                                     options:UIViewAnimationCurveEaseInOut
                                  animations:^{
                                      [viewforCopyLandscape2 setFrame:CGRectMake(0, 20, self.view.bounds.size.width/2, self.view.bounds.size.height)];
                                      [viewForCopy setFrame:CGRectMake(407, 10, self.view.bounds.size.width * .78, self.view.bounds.size.height * 1.25)];
                                      [self.navigationController.navigationBar setAlpha:0.0f];  
                                      viewforCopyLandscape2.alpha = 1.0f;
                                  } 
                                  completion:^(BOOL finished) {

                                      UIView *viewForCopyLandscape = [[[UIView alloc]initWithFrame:CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.bounds.size.width, self.view.bounds.size.height)]autorelease];
                                      UIGraphicsBeginImageContext(CGSizeMake(self.view.bounds.size.width, self.view.bounds.size.height));
                                      [self.navigationController.view.layer renderInContext:UIGraphicsGetCurrentContext()];
                                      UIImageView *viewImage = [[[UIImageView alloc]initWithImage:UIGraphicsGetImageFromCurrentImageContext()]autorelease];
                                      UIGraphicsEndImageContext();
                                      viewForCopyLandscape = viewImage;
                                      [self.navigationController.view addSubview:viewForCopyLandscape];
                                      [self.navigationController.view bringSubviewToFront:viewForCopyLandscape];

                                      [viewForCopy setAlpha:0.0f];
                                      [UIView animateWithDuration:2.0f
                                                            delay:0.0f
                                                          options:UIViewAnimationCurveEaseInOut
                                                       animations:^{

                                                           CATransform3D transform = CATransform3DMakeRotation(-M_PI / 1.1, 0.0, 1.0, 0.0);
                                                           transform.m34 = 1.0f / 2500.0f;
                                                           viewForCopyLandscape.layer.transform = transform;

                                                           [self.navigationController.view sendSubviewToBack:viewForCopy];
                                                           [UIView setAnimationTransition:UIViewAnimationTransitionNone forView:self.navigationController.view cache:YES];
                                                           [self.navigationController pushViewController:viewController animated:NO];
                                                           [viewforCopyLandscape2 removeFromSuperview];

                                                       }           
                                                       completion:^(BOOL finished) {
                                                           [[_gridView cellForItemAtIndex:index] setAlpha:1.0f];
                                                           [viewForCopy removeFromSuperview];
                                                           [UIView animateWithDuration:1.00 animations:^ {
                                                               [viewForCopyLandscape setAlpha:0.0f];

                                                           }];
                                                       }];
                                  }];
}