我不知道如果可能的话,我能说得有多清楚,但无论如何我都会试着问。
我正在尝试制作一个应用程序,它看起来像一个网页,我将界面称为页面。
主窗口有 7 个指向 7 个页面的链接,每个页面有指向 2-3 个页面的链接。我使用导航控制器一切都很完美,但有一件小事困扰着我。
所有这些页面都具有相同的背景图像。当我从一个页面导航到另一个页面时,我可以看到背景图像的变化,这是正常的。但是在导航时看到背景图像的锋利边缘很烦人。我希望背景图像保持静止,其他内容在导航时出现在上面。
有没有解决我问题的技巧?使用故事板非常简单,所以你认为值得尝试另一种解决方案,在这种情况下,处理如此多的视图可能会很痛苦。(我知道这听起来很傻,如果我想让它完美,我应该做艰苦的工作。
谢谢
阿尔佩伦。
我所做的是这样的:
使每个视图控制器上的所有内容在代码中都有一个出口。当您关闭 VC 时,请对所有这些内容进行动画处理,使其 alpha 为 0。然后推送新的 VC,所有项目都以 alpha 0 开头,并将它们动画化回 1。如果您调用关闭并推送 VC 的 NOT ANIMATED,则背景图像不会更改,并且看起来最后一个屏幕淡出,新屏幕淡入,同时保持一致的背景。
这就是你要找的吗?
下面是一个更具体的例子:
假设我们有 2 个视图控制器,VC1 和 VC2。VC1 在框架中央有一个大按钮(按钮 1),按下时会调出 VC2。VC2 只有一个后退按钮(按钮 2),它将返回 VC1。
我们从界面生成器开始,我们将视图的背景图像设置为 VC1 和 VC2 中的相同图像。然后,我们为每个 VC 添加一个按钮,并将它们连接到标头中的适当插座,并在我们的 .m 文件中合成属性。在界面生成器中,将每个按钮的 alpha 设置为零。它会消失,但它仍然存在,只是看不见。
我们还为用户按下每个按钮创建了一个方法,我将在 VC1 中调用 firstButton,在 VC2 中调用 backButton。将它们连接到按钮 1 和按钮 2。
除非我们以其他方式编码,否则我们的按钮是不可见的。因此,当应用程序加载并在屏幕上看到VC1时,我们需要按如下方式重新设置按钮的不透明度。如果您不熟悉动画语法,请不要担心,这很容易。
- (void) viewDidAppear:(BOOL)animated {
// Animations
[UIView animateWithDuration:0.2 // How long the animation takes
delay:0 // Any once we hit this line of code before the animation takes place
options:UIViewAnimationCurveEaseInOut // Play around with this one to see what style of animation you want
animations:^{ // This is where we actually say what we want to animate. Make sure you use block syntax like I have here.
self.button1.alpha = 1;
}
completion:^ (BOOL finished){} // If you want to do something else after the animations are complete you can call that here.
];
}
就是这样!请注意,我在 viewDidSeem 方法中执行此操作,而不是在 viewDidLoad 或 viewWillAppear 中执行此操作,因为这些发生在屏幕上显示任何内容之前,并且此时无法播放动画。
当用户点击 VC1 中的按钮时,我们需要将不透明度动画化回零,然后将 VC2 推送到堆栈上。我们这样做的方式几乎与上一个动画完全相同,但这次我们需要在完成块中更改为 VC2。如果我们使用 animated:NO 调用执行此操作,则看不到第一个视图滑出。由于背景图像相同,看起来我们仍然在同一个VC中。
- (void) firstButton {
VC2 *secondVC = [[VC2 alloc] initWithNibName:@"VC2"];
[UIView animateWithDuration:0.2
delay:0
options:UIViewAnimationCurveEaseInOut
animations:^{
self.button1.alpha = 0;
}
completion:^ (BOOL finished){ // Presenting the instance of VC2
[self.navigationController pushViewController:secondVC animated:NO];
}
];
}
现在我们已经完成了 VC1 的所有动画。我们需要将淡入效果复制到 VC2 的 viewDidSeem 方法(我不打算再次复制它,但它在字面上是相同的),并将代码复制到 backButton 方法,它与 firstButton 方法几乎完全相同,只是我们正在弹出视图控制器而不是推送一个新的:
- (void) backButton {
[UIView animateWithDuration:0.2
delay:0
options:UIViewAnimationCurveEaseInOut
animations:^{
self.button2.alpha = 0;
}
completion:^ (BOOL finished){ // Removing the instance of VC2
[self.navigationController popViewControllerAnimated:NO];
}
];
}
这能说明问题吗?
尝试符合您要求的其他实现。 在普通视图之上使用 UIScrollView。 普通视图可以包含背景图像,UIScrollView 可以包含页面。