以编程方式重新创建默认的pushViewController动画(不带导航控制器)

时间:2012-05-26 00:36:00

标签: ios cocoa-touch uiview

我想在可见屏幕之外创建一个View并按下它(就像默认的pushViewController动画一样),但我不能在外面创建UIView。我在这里尝试这个代码,但它不起作用。始终创建View并在当前的UIScreen界限中显示。这意味着,不是两个视图,一个被推出,一个被推入,只有视图“移动”,新视图就在它的位置。

在要显示的视图的.m中:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // set the views frame off the screen
    self.view.frame = CGRectMake(320, 0, 320, 460);
}

在实际进行转换的方法中:

-(void)showOverview:(UIViewController *)sender  //sender = mapviewController
{
    NSLog(@"overview");
    // current view (frame) = mapviewCOntroller.view
    CGRect outFrame = self.view.frame;

    if (!self.overviewViewController) {
        self.overviewViewController = [[UCOverviewViewController alloc] init];
        self.overviewViewController.transitionDelegate = self;

        // create a new View for the overview
        [self.overviewViewController.view setCenter:self.view.center];
        [self.view.window addSubview:self.overviewViewController.view];
        [self.view.window bringSubviewToFront:self.mapViewController.view];
    }

    CGRect inFrame = self.overviewViewController.view.frame;
    outFrame.origin.x = outFrame.origin.x-outFrame.size.width;  
    inFrame.origin.x = self.view.frame.origin.x;

    [UIView animateWithDuration:0.5f animations: ^{
        [self.view setFrame:outFrame];
    }];  
}

编辑:这是我的最终代码,至少是重要部分。现在,在屏幕外视图滑入的同时,当前可见的视图会将滑块关闭屏幕。

-(void)showOverview
{
    if (!self.overviewViewController) {
        NSLog(@"OverviewViewController created!");
        self.overviewViewController = [[UCOverviewViewController alloc] init];
        self.overviewViewController.transitionDelegate = self;
        // add the subView
        [self.view addSubview:self.overviewViewController.view];
        [self.view sendSubviewToBack:self.overviewViewController.view];
    }
    CGRect outFrame = self.mapViewController.view.frame;
    CGRect inFrame = self.overviewViewController.view.frame;

    outFrame.origin.x -= outFrame.size.width;
    inFrame.origin.x = self.view.frame.origin.x;
    self.isOverviewViewVisible = YES;

    [UIView animateWithDuration:0.5f animations: ^{
        [self.mapViewController.view setFrame:outFrame];
        [self.overviewViewController.view setFrame:inFrame];
    }];
}

2 个答案:

答案 0 :(得分:0)

你的问题就在这一行。

        self.overviewView = self.overviewViewController.view;

您将使用您已有的视图覆盖您创建的视图。

以下不是一个很好的方法,但它应该与我认为你的一致。

- (void)viewDidLoad {
      self.overviewViewController.view.frame = CGRectMake(320, 0, 320, 460);
      self.overviewViewController.view.backgroundColor = [UIColor blueColor];
}

然后你想要另一个动作来做动画。

  [UIView animateWithDuration:0.5f animations: ^{
    self.overviewViewController.view.frame = CGRectMake(0,0,320,460);  
  }]; 

答案 1 :(得分:0)

你的代码中有一些奇怪和不正确的东西让你无法理解实际发生的事情,但是......忘记在任何地方使用窗口。你唯一需要担心的是这个。说视图A是您的主要视图。视图B是您想要在外面的视图,然后从A进入。然后,从nib或手动创建B,将其添加为子视图以查看A,在输入动画块以将其移动到位之前,请确保当前帧设置为{ViewA.bounds.size.width,0,ViewB.bounds.size.width,ViewB.bounds.size.height}。假设你希望它从右上角进入。