UINavigationController - 在所有视图中保留背景图片

23

有没有一种方法可以让导航控制器中所有视图保持相同的背景图像?目前,我在每个视图的viewDidLoad方法中加载相同的背景图像,但是当从一个视图导航到另一个视图时,背景图像会移动。我更希望视图的内容在背景“滑动”开/关屏幕时保持不变,而背景保持固定。这是我当前的背景图像加载代码:

UIImageView *background = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)];
background.image = [UIImage imageNamed:@"InfoBackground.png"];
[self.view addSubview:background];
[self.view sendSubviewToBack:background];
[background release];

谢谢!


你会在应用的每个部分都使用这张背景图片吗? - sooper
根据Kevin的问题,@bryanmac似乎在谈论导航控制器中当前顶部视图控制器的背景图像,而不是导航栏。 - Matt Mc
这个问题询问如何在UINavigationController上获得静态背景,而不会随着各个页面的动画而移动。#9447979正在询问如何使用UINavigationBar.appearance全局设置导航栏背景。这两个问题甚至没有任何关系。这是为什么“社区管理”是一个可怕的想法的完美例子 - 人们看到“关闭(3)”,只是为了加入团队,甚至不阅读。 - Glenn Maynard
@GlennMaynard - (完全没有争论,只是辩论)我投票支持重新开放这个话题。但是,我很好奇你为什么认为社区的自我管理是一个坏主意。你更喜欢什么?难道把绝对权力交给所有人而不是只有少数人不是更好吗?当然,也有一些缺点(例如有时人们会结伴而来变得“受欢迎”),但我个人认为这比其他选择要好。有更多的人掌管,就会有更少的滥用权力。 - user2555451
SO的管理并不鼓励“正确”的管理;关闭问题错误并没有处罚,所以每当有人看到一个问题时都会点击“关闭(3)”,因为这让他们感觉已经帮助了别人 - 实际上并没有做什么工作。 (这也不是另一种选择 - 这个网站仍然有常规的管理员,并且我也看到过很多被错误关闭的问题。) - Glenn Maynard
3个回答

29

嗯,也许如果你查看文档(向下滚动到图2),你就会知道你要处理什么。因为你正在为被推入UINavigationController的每个视图控制器设置背景图片,所以你会得到那个动画效果。你需要做的是将背景图片设置到导航控制器本身。

我相信myNavController.view insertSubview:myImageView atIndex:0应该可以工作。如果你的图片需要完全填充内容视图的后面,你可以根据导航控制器的属性访问导航栏和工具栏的坐标和/或高度来设置框架坐标。如果不需要,只需将框架设置为superview的边界。

让我知道进展如何。

编辑:哦,注意确保每个视图控制器都有透明背景。


这个是有效的,但我们真的能假设它总是在索引0上吗? - WYS
1
@WingYn 嗯,为什么不可能在索引0呢?我相信一旦你设置了它,导航控制器中就没有代码会移动它...测试一下吧。 - Matt Mc
4
这个方法可行,但会破坏动画效果。UIViewController似乎默认视图是不透明的,因此新视图过渡时会覆盖旧视图。旧视图实际上并没有完全移出屏幕,如果它没有被一个新的不透明视图覆盖,这一点将变得可见。 - Glenn Maynard
1
@GlennMaynard 有趣,你说得对。自从iOS 7以来,这个功能就不能正常工作了,因为UINavigationController的动画行为已经改变了。也许解决的方法之一是在你推入一个新的视图控制器时淡出较低堆栈上的视图控制器?我需要测试一下,但我现在没有我的设置。 - Matt Mc

1
我认为更好的想法是将背景图像放置在窗口上,并将所有视图(所有视图控制器的视图)的背景颜色设置为透明色[UIColor clearColor]

1

如果您想要背景图像静态,则只有一种方法,但我不知道是否可能。如果我们将图像放在窗口中并使导航控制器透明,则无论您做什么,它都会保持静态。因为我们在推送或弹出时不会更改窗口。

我只是建议尝试这种方式,我还没有尝试过。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接