Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在iPad上展示带有垂直旋转动画的formSheet modalViewController_Ipad_Animation_Centering_Presentmodalviewcontroller_Screen Rotation - Fatal编程技术网

在iPad上展示带有垂直旋转动画的formSheet modalViewController

在iPad上展示带有垂直旋转动画的formSheet modalViewController,ipad,animation,centering,presentmodalviewcontroller,screen-rotation,Ipad,Animation,Centering,Presentmodalviewcontroller,Screen Rotation,我在splitViewDetailController中有带有splitViewController和tableViewController的iPad应用程序。 我想在点击tableCell后,用自定义动画显示detailViewController(带有UIModalPresentationFormSheet)。动画应该是tableViewCell的垂直旋转,旋转的单元格应该转换为detailViewController视图。整个动画应该看起来像iTunes播客中的动画 以下是我的动画代码:

我在splitViewDetailController中有带有splitViewController和tableViewController的iPad应用程序。 我想在点击tableCell后,用自定义动画显示detailViewController(带有UIModalPresentationFormSheet)。动画应该是tableViewCell的垂直旋转,旋转的单元格应该转换为detailViewController视图。整个动画应该看起来像iTunes播客中的动画

以下是我的动画代码:

CGRect rectInCell = [[self.cellView superview] convertRect:self.cellView.frame toView:cell];
CGRect rectInTableView = [self.tableView rectForRowAtIndexPath:[self.tableView indexPathForCell:cell]];
CGRect rectInSuperview = [self.tableView convertRect:rectInTableView toView:[[[APP_DELEGATE window] subviews] lastObject]];

CGRect imgRect = CGRectMake(rectInSuperview.origin.x+rectInCell.origin.x, rectInSuperview.origin.y+rectInCell.origin.y, rectInCell.size.width, rectInCell.size.height);

self.originalRelativeFrame = imgRect;
self.originalFrame      = self.cellView.frame;
self.originalSuperview  = self.cellView.superview;
self.originalTransform  = self.cellView.transform;

[self.cellView setFrame:imgRect];
if (self.whiteView == nil) {
    self.whiteView = [[UIView alloc] init];
    [self.whiteView setBackgroundColor:[UIColor whiteColor]];
}
[self.whiteView setFrame:imgRect];
[self.whiteView setAlpha:0];

self.cellView.layer.zPosition = self.cellView.frame.size.width;
self.whiteView.layer.zPosition = self.cellView.frame.size.width;

[[[[APP_DELEGATE window] subviews] lastObject] addSubview:self.whiteView];
[[[[APP_DELEGATE window] subviews] lastObject] addSubview:self.cellView];


CATransform3D rotation = CATransform3DMakeRotation(M_PI/2, 0, 1, 0);
CATransform3D scale = CATransform3DMakeScale(1.5,1.5,1);//(540.0/self.cellView.bounds.size.width, 620.0/self.cellView.bounds.size.height, 1);
CGPoint finCent = CGPointMake([[[[APP_DELEGATE window] subviews] lastObject] bounds].size.width/2.0, [[[[APP_DELEGATE window] subviews] lastObject] bounds].size.height/2.0);
//(finCent.x > self.cellView.center.x) ? (finCent.x - self.cellView.center.x) : (self.cellView.center.x - finCent.x);
CGPoint center = CGPointMake((self.cellView.center.x - finCent.x) / 2.0 ,(self.cellView.center.y - finCent.y )/2.0);

[UIView animateWithDuration:ANIMATION_DURATION_HALF delay:0 options:UIViewAnimationOptionCurveEaseOut
                 animations:^{

                     [self.cellView.layer setTransform:CATransform3DConcat(scale, rotation)];
                     [self.cellView setCenter:CGPointMake(self.cellView.center.x - center.x, self.cellView.center.y - center.y)];
                     //[self.cellView setAlpha:0];

                     [self.whiteView.layer setTransform:CATransform3DConcat(scale, rotation)];
                     [self.whiteView setCenter:CGPointMake(self.whiteView.center.x - center.x, self.whiteView.center.y - center.y)];
                     //[self.whiteView setAlpha:1];

                     [self.blackView setAlpha:0.3];

                 }
                 completion:^(BOOL finished) {

                     [self.whiteView setAlpha:1];
                     [self.cellView setAlpha:0];

                     [UIView animateWithDuration:ANIMATION_DURATION_HALF delay:0 options:UIViewAnimationOptionCurveLinear
                                      animations:^{

                                          CATransform3D rotation = CATransform3DMakeRotation(M_PI, 0, 1, 0);
                                          CATransform3D scale = CATransform3DMakeScale(540.0/self.cellView.bounds.size.width, 620.0/self.cellView.bounds.size.height, 1);
                                          CGPoint finCent = CGPointMake([[[[APP_DELEGATE window] subviews] lastObject] bounds].size.width/2.0, [[[[APP_DELEGATE window] subviews] lastObject] bounds].size.height/2.0);

                                          [self.cellView.layer setTransform:CATransform3DConcat(scale, rotation)];
                                          [self.cellView setCenter:finCent];

                                          [self.whiteView.layer setTransform:CATransform3DConcat(scale, rotation)];
                                          [self.whiteView setCenter:finCent];

                                      }
                                      completion:^(BOOL finished) {

                                          [self presentModalViewController:self.modalCtrl animated:YES];


                                      }];

                 }];
但问题是应用程序的轮换。在我的详细视图控制器后面旋转应用程序白后,不要停留在窗口中间。


你知道如何解决这个问题吗?

当用户旋转设备时,你应该重新安排视图的布局

UIViewController类提供了两种方法来处理此问题:

– willRotateToInterfaceOrientation:duration:
– willAnimateRotationToInterfaceOrientation:duration:
– didRotateFromInterfaceOrientation:
看一看

-(void)将旋转到接口方向:(ui接口方向)到接口方向
持续时间:(NSTimeInterval)持续时间{
CGRect imgRect=;
[self.whiteView setFrame:imgRect];
}

计算新帧时,可以使用
toInterfaceOrientation
参数来了解哪个方向。另一个可能使事情更简单的选项是定义视图
中心

我想知道是否有办法将自动调整掩码添加到whiteView。但我找不到正确的掩码组合,无法在不计算新中心的情况下强制whiteView将自身居中。如果要自动调整大小,请尝试:
UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight
。还要检查superview的
resizesSubviews
属性是否设置为
YES
。最后,我使用willAutorotate方法实现了您的解决方案,它工作正常。谢谢
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
                            duration:(NSTimeInterval)duration {

       CGRect imgRect = <CALC YOUR NEW FRAME HERE TO ACCOUNT FOR THE DEVICE ORIENTATION>;
       [self.whiteView setFrame:imgRect];
}