0

我想实例化一个 viewController 并将其放在当前显示的视图后面。然后移动原始视图的框架以显示其后面的视图。

我不能先创建底部视图并在顶部添加顶部视图。我将创建多个底部视图,内存无法一次处理整个堆栈。

我已经遇到的问题。

  • 添加子视图并将其发送到后面意味着移动原始视图的框架移动整个视图,而不是显示新视图。
  • 实例化新视图并调用presentViewController释放原始视图(如果我以模态方式添加它)

任何人都可以帮忙吗?或者引导我一个方向?

4

2 回答 2

1

公平地说,您要从 vc1 过渡到 vc2,您想要的是vc2 在 vc1 下方并且 vc1 滑开以显示它的外观吗?

如果是这样,那么从 sdk 的角度来看,这在不做任何不寻常或危险的事情的情况下是可行的。诀窍是执行正常的实例化和呈现步骤,但在 vc1 中,在呈现 vc2 之前,将一个看起来像 vc1 的 UIImage 交给它。Vc2 在该图像出现之前将其自身覆盖,然后将图像滑开以显示其自身。

以下是步骤:

1)在vc1上,实现本文中的方法。它捕获视图的图像。

2)有一些动作让你想展示vc2,这样做......

- (void)presentVc2:(id)sender {
    UIImage *image = [self makeImage];  // it was called makeImage in the other post, consider a better name
    MyViewController2 *vc2 = [[MyViewController2 alloc] initWithNibName:@"MyViewController2" bundle:nil];
    vc2.presentationImage = image;  // more on this later

    // this line will vary depending on if you're using a container vc, but the key is
    // to present vc2 with NO animation
    [self presentViewController:vc2 animated:NO completion:^{}];
}

3) 在 MyViewController2 上创建一个名为 presentationImage 的 UIImage 属性并将其设置为 public。然后在 MyViewController2 ...

// before we appear, cover with the last vc's image
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    UIImageView *imageView = [[UIImageView alloc] initWithImage:self.presentationImage];
    imageView.frame = self.view.bounds;
    imageView.tag = 128;
    [self.view addSubview:imageView];
}

// after we appear, animate the removal of that image
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    UIImageView *imageView = (UIImageView *)[self.view viewWithTag:128];
    [UIView animateWithDuration:0.5 animations:^{
        imageView.frame = CGRectOffset(imageView.frame, -self.frame.size.width, 0); 
    }];
}
于 2013-01-09T23:14:09.277 回答
0

您可以简单地将顶视图的内容放入一个新的 UIView ,其框架等于您的视图控制器的视图框架。然后将底部视图粘贴在容器视图下方。然后,移动容器视图将移动其所有内容,但保持底部视图完好无损。

于 2013-01-09T22:27:58.160 回答