0

我刚刚将我的应用程序从 TabView 驱动更改为 CollectionView 驱动,因为我的应用程序中有太多部分对于 TabView 是可行的。当您启动应用程序时,您会看到 CollectionView 中的多个项目,选择这些项目中的任何一个都会将您带到应用程序的相关部分。

在 XCode 中,集合视图存在于自己的故事板中,应用程序的每个部分都有自己的故事板。

在 CollectionView 的 didSelectItemAtIndexPath 中,我启动相关的右舷如下;

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"relevant_storyboard" bundle:nil];
UIViewController* vc = [storyboard instantiateInitialViewController];
[self presentViewController:vc animated:YES completion:nil];

现在,没有一个内置的过渡动画真的适合从 CollectionView 启动,所以我真的很想要自定义效果,例如放大。但是,我正在努力寻找任何适合我的体面示例来创建任何一种自定义过渡。我试过[UIView transitionFromView]了,但我认为这不适合在 UIViewControllers 之间进行转换。我已经尝试过transitionFromViewController:toViewController:,但认为我没有正确设置视图层次结构。我也尝试过使用 CATransition 没有成功。

我曾考虑过使用自定义 segue 来做到这一点,但是由于我的 CollectionView 位于它自己的故事板中,并且我的应用程序的每个部分都有单独的故事板,所以我看不出我该如何做到这一点。至少不是没有应用程序的所有部分都在一个故事板中,这会使故事板变得庞大且难以管理。

那么,谁能给我任何代码示例或有关如何解决此问题的指示?

4

2 回答 2

1

你试过 UIView 动画块吗?

 [UIView animationWithDuration:1.0 animation^ {
    // do custom animation with the view
 }completion:^(BOOL finished) {
     if(finished) {
        NSLog(@"Finished");
     }
 }];

它允许您在处理 UIView(s) 甚至 UIViewControllers 时执行自定义动画。在处理自定义动画动作时,我经常使用它。

编辑:

例如,如果您想让当前控制器的视图向上移动屏幕,并让第二个视图控制器向下滑动代替它,只需执行

 [UIView animationWithDuration:1.0 animation^ {
    // do custom animation with the view
    // make sure CoreGraphics.framework is imported
    // sliding current view to the top of the screen
    self.view.transform = CGAffineTransformMakeTranslation(0,0);

    // sliding 2nd view down..
    // uncomment the following line, and one of the options for translation
    //SecondView *sv = [[SecondView alloc] init];
    // just edit the x,y in CGAffineTransformMakeTranslation to set where it will go
    //sv.view.transform = CGAffineTransformMakeTranslation(320, 480) // iphone 4
    //sv.view.transform = CGAffineTransformMakeTranslation(768, 1024) // ipad 1

 }completion:^(BOOL finished) {
     if(finished) {
        NSLog(@"Finished");
     }
 }];

希望这可以帮助!

于 2013-07-21T19:54:22.623 回答
1

在我的应用程序中,我使用了类似的效果从集合视图单元格中的缩略图放大到占据整个屏幕的子视图控制器。可以想象,您也可以为导航控制器推送做同样的事情。

在我的代码中,我有一个scoreView关于单元格子类的属性,我想放大到全屏。在您的情况下,您可能希望将 aUIImageView与新视图的屏幕截图一起使用。或者,您可以向新视图控制器展示旧视图控制器的屏幕截图,然后从那里开始制作动画。

//Instantiate the view controller to be animated in...

//If the cell is not completely inside the collection view's frame, a dissolve animation might be more graceful.
BOOL dissolveAnimation = !CGRectContainsRect(CGRectMake(0, 0, self.collectionView.frame.size.width, self.collectionView.frame.size.height), cellRect);

//Get the frame of the cell in self.view coordinates, then the frame of the thumbnail view
CGRect cellRect = [self.collectionView layoutAttributesForItemAtIndexPath:indexPath].frame;
cellRect = CGRectOffset(cellRect, 0.0, -self.collectionView.contentOffset.y);
VSScoreCell *scoreCell = (VSScoreCell *)[self.collectionView cellForItemAtIndexPath:indexPath];
CGRect scoreRect = dissolveAnimation ? CGRectMake(0.0, 0.0, self.view.frame.size.width, self.view.frame.size.height) : CGRectMake(cellRect.origin.x + scoreCell.scoreView.frame.origin.x, cellRect.origin.y + scoreCell.scoreView.frame.origin.y, scoreCell.scoreView.frame.size.width, scoreCell.scoreView.frame.size.height);
VSScoreView *scoreView = [[VSScoreView alloc] initWithFrame:scoreRect];

//Initialize the view that will be animated up (in this case scoreView)...

if (dissolveAnimation)
    scoreView.alpha = 0.0;

[self.view addSubview:scoreView];

[UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
    if (dissolveAnimation)
        scoreView.alpha = 1.0;
    else
        scoreView.frame = CGRectMake(0.0, 0.0, self.view.frame.size.width, self.view.frame.size.height);
} completion:^(BOOL finished) {
    if (finished)
    {
        //Add scoreDisplayController as a child view controller or present it without animation
        [scoreView removeFromSuperview];            
    }
}];

当然,新的 iOS 可能会使这更容易(我的嘴唇是密封的),但我希望这对您的情况有所帮助!

于 2013-07-21T20:19:30.993 回答