1

在我的 iPhone 应用程序中,我试图暗示拥有一个静态导航栏,因此标题和按钮在切换视图时永远不会滑动。

我想不出办法(至少),所以你有什么建议吗?我需要在导航栏空间中有一个静态标题和按钮(即使我不使用 UINavigationBar,而是进行一些自定义),以便当我执行诸如推送视图控制器之类的操作时,当它在我的导航上滑动时栏不会移动,并且按钮会更改新视图的功能。

编辑

好的,我想到了一种可能的方法。我的每个视图都有一个辅助视图,其中黄金视图内容,导航栏对象除外。我可以覆盖 pop 和 push 方法来仅在屏幕上和屏幕外设置此子视图的动画吗?

4

3 回答 3

3

只需像往常一样进行推送,但将其设置为不动画。

IE

[self.navigationController pushViewController:newViewController animated:NO];

那么当你想回去的时候...

[self.navigationController popViewControllerAnimated:NO];

然后你可以有两个导航栏,但它看起来是同一个栏,因为它没有动画。

编辑也可以在视图中设置动画并保留导航栏

我不确定应用程序的整个流程,但如果你想保留导航栏并滑动新 UI,那么你可以创建一个滚动视图(带分页)并将每个 VC 的视图放在不同的框架上滚动视图什么的。

你为什么要保持导航栏不动?为导航栏设置动画并在其上保留相同的按钮等没有任何问题。

话虽如此,如果您使用不同的 VC,那么导航栏无论如何都应该更改以显示您当前正在查看的 VC 的详细信息(即标题)。

另一种更激进的方法

好的,现在横向思考:D

怎么样,您使用非动画推送和弹出(如上),而不是仅显示 UI,您可以从相关方面对其进行动画处理。(然后您为 UI 子类化的单例或 VC 子类可以在所有视图控制器中为您执行此操作)。

下一个问题是,在新 UI 中进行动画处理之前,UI 看起来会立即变为空白,因此您需要对旧 UI 进行动画处理。这意味着两个 UI(旧的和新的)必须同时出现在屏幕上。

您可以通过将旧 UI 的整个视图转换为图像(不难找到链接)然后将该图像传递给新的 VC 来解决这个问题。然后,新的 VC 将立即显示此图像并在屏幕上将其动画化,同时将其自己的 UI 动画化到屏幕上。

真的没有听起来那么难做。特别是如果你继承 UIViewController 广告给它一个函数animateUI和一个属性oldUIImagedirection. 然后你可以在这个类中重写 viewWillAppear 来为你做动画。然后你唯一需要做的就是在你推/弹出它时给每个 VC 一个图像和一个方向。

这只是给人一种你所追求的错觉,意味着你仍然可以保持一个相当简单的对象模型和应用程序的流程。

...或者其他的东西。

于 2013-01-05T00:40:20.357 回答
2

只是对@Fogmeister 的好主意的即兴演奏......

在呈现视图控制器中,通过执行此处的建议来获取 self.view 的图像。那么,到了介绍的时候...

UIImage *image = [self makeImage];  // what it was called in the other post, consider a better name
MyViewController *newVC = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
newVC.presentationImage = image;
[self.navigationController pushViewController:newVC animated:NO];

在 MyViewController 中,给它一个名为 presentationImage 的 UIImage 属性,然后...

- (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];
}

- (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-05T02:00:30.060 回答
0

要以“干净”的方式执行此操作,您需要放弃 UINavigationController 并编写一个自定义容器控制器,该控制器在推送新视图控制器时不会将新导航项推送到其导航栏(或允许您将导航项推送到动画视图控制器视图的推送时的非动画方式)。

然而,这样做需要一些时间。如果你决定这样做,我推荐 UIViewController 容器上的 WWDC 会话。

我想到的另一种选择是(通过子类化或方法调配)改变 UINavigationController 的行为以在为 viewcontroller-push 设置动画时推送非动画导航项。

我从未对此进行过测试,但是在这样的子类中覆盖 push (和 pop 分别)可能会起作用:

- (void)pushViewController:(UIViewController *)vc animated:(BOOL)animated {
    [super pushViewController:vc animated:animated];
    [self.navigationBar setItems:self.navigationBar.items animated:NO];
}

如果这个方法不起作用,那么在调用 pushViewController:animated: 之后,直接检查导航栏内发生的动画可能是值得的。也许你可以取消一些动画直接进入最终状态。

于 2013-01-05T01:32:12.147 回答