0

我有几个 UIViewControllers,它们在右侧包含相同的信息,但在屏幕左侧包含不同的信息。我想从一个过渡到另一个,但只为左侧设置动画,即向上滑动左侧,同时保持右侧静止。

-(void)goNextStep{
    UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil];
    NSString *identifier = @"";
    if (_model.isLoggedIn) {
        //The user is already logged in, don't display the loginViewController
        // instead take them to the next viewController
        identifier = [_model nextStepIdentifier];
        if ([identifier isEqualToString:@""]) {
            identifier = @"loginController";
        }
    }else{
        identifier = @"loginController";
    }

    UIViewController *nextVC = (UIViewController *)[mainStoryboard instantiateViewControllerWithIdentifier:identifier];

    [nextVC setHidesBottomBarWhenPushed:YES];
    CATransition *transition = [CATransition animation];
    transition.duration = 0.5f;
    transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    transition.type = kCATransitionPush;
    transition.subtype = kCATransitionFromBottom;
    transition.delegate = self;
    //I would love to have
    //transition.rect=MyRect;
    [self.navigationController.view.layer addAnimation:transition forKey:nil];

    [self.navigationController pushViewController:nextVC animated:NO];
}

我想将此过渡限制为屏幕的已定义矩形。

有没有办法将过渡动画限制为矩形?如果是这样,怎么做?

4

2 回答 2

0

导航控制器推送没有办法做到这一点。VC,尤其是容器 VC 的设计理念是一次只有一个控制界面。甚至那个 navigationController.view.layer 也不是你可以操纵的。

类似这样的学校解决方案是使用具有委托(可能还有数据源)出口的视图来实现界面的不变的右侧。想想 UITableView。想要拥有此视图的视图控制器以传统方式将其添加到其层次结构中。无论它出现在哪个 VC 上,它都可能具有相同的数据源(甚至相同的委托)。

但是如何实现预期的过渡呢?我想不出一种方法来准确地得到你正在寻找的东西(也就是说,右边没有任何变化,左边有一个正常的推送转换),但考虑一下:

1)如果信息视图在推送之前在推送的 vc 上都设置为相同的状态,则转换看起来会非常好。2)如果信息视图有一个幻灯片关闭动画,它变得非常瘦 - 刚好足够宽以提供“打开”控件 - 那么您可以在推送转换之前关闭它,在下一个 VC 上将其设置为关闭,并可选择在推送后再次打开它。

于 2012-09-12T14:44:15.787 回答
0

好的,在从 viewController A 到 viewController B 的初始推送中,我找不到处理这种转换的方法,但是我找到了一个似乎效果很好的解决方法,尽管我需要进行更多的按摩才能让它完全按照我需要的方式工作,这是正确的方向。

首先,我在 viewController B 中放置了一个 UIImageView,并在该 viewController 中创建了一个插座。我还给这个 UIImageView 一个标签,1000 为我工作。

接下来,我将 viewController A 中的代码更改为以下内容:

-(void)goNextStep{
    UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil];
    NSString *identifier = @"";
    if (_model.isLoggedIn) {
        //The user is already logged in, don't display the loginViewController
        // instead take them to the next viewController
        identifier = [_model nextStepIdentifier];
        if ([identifier isEqualToString:@""]) {
            identifier = @"loginController";
        }
    }else{
        identifier = @"loginController";
    }

    UIViewController *nextVC = (UIViewController *)[mainStoryboard instantiateViewControllerWithIdentifier:identifier];

    UIImageView *infoImageView = [nextVC infoImageView];
    infoImageView.image = [self transitionImageFromView:self.transImageRect];

    [nextVC setHidesBottomBarWhenPushed:YES];
    [self.navigationController pushViewController:nextVC animated:NO];
}

因此,在推送到下一个 viewController (B) 之前,我抓取了 viewController A 左侧的屏幕截图,并将刚刚添加到 viewController B 的图像设置为该屏幕截图。

现在在 ViewController BI 中添加了以下内容,请忽略不整洁的代码。

-(void)viewDidAppear:(BOOL)animated{
    CGRect stage = self.view.bounds;
    CGRect actor =self.formView.frame;
    CGRect spot = actor;
    CGRect cover= self.transitionView.frame;
    cover.origin.y=(0.0 - cover.size.height);
    actor.origin.y = stage.size.height;
    self.formView.frame=actor;

    [UIView animateWithDuration:0.5 animations:^{
        self.formView.frame=spot;
        self.transitionView.frame=cover;

    }];

}

#define kINFO_VIEW_TAG  1000

// answer the info image view
// add this declaration to view controller B .h file
//
- (UIImageView *)infoImageView {
    return (UIImageView *)[self.view viewWithTag:kINFO_VIEW_TAG];
}

这将处理向上移动 UIImageView 和带有登录表单的 UIView 的转换。看起来我什至不需要 CATransition。

于 2012-09-12T16:56:00.393 回答