0

如果可能的话,我不知道我能有多清楚或上帝,但无论如何我都会尝试问。

我正在尝试制作一个应用程序,它看起来像一个网页,我将这些界面称为页面。

主窗口有 7 个链接到 7 个页面,每个页面有 2-3 个页面的链接。我正在使用导航控制器,一切都很完美,但有一点让我很烦恼。

所有这些页面都具有相同的背景图像。当我从一个页面导航到另一个页面时,我可以看到背景图像发生变化,这是正常的。但是在导航时看到背景图像的锐利边缘很烦人。我希望背景图像保持静止,并在导航时显示其他内容。

有什么诀窍可以解决我的问题吗?使用故事板非常简单,所以你认为值得尝试一个替代解决方案,在这种情况下处理这么多视图可能会很痛苦。(我知道这听起来很傻,如果我想让它完美,我应该努力工作。我只是想知道你们在做什么)

谢谢,

阿尔卑斯山。

4

2 回答 2

3

我要做的是:

使每个视图控制器上的所有内容在您的代码中都有一个出口。当您关闭一个 VC 时,将所有这些东西设置为 alpha 为 0。然后推送新的 VC,所有项目都以 0 的 alpha 开头并将它们动画回 1。如果您调用关闭并推送VC 没有动画,则背景图像不会改变,并且会出现上一屏淡出,新一屏淡入,同时保持一致的背景。

那是你要找的吗?

这是一个更具体的例子:

假设我们有 2 个视图控制器,VC1 和 VC2。VC1 在框架的中心有一个大按钮(button1),按下它会弹出 VC2。VC2 只有一个后退按钮 (button2),它将返回到 VC1。

我们从 Interface Builder 开始,在这里我们将视图的背景图像设置为 VC1 和 VC2 中的相同图像。然后我们为每个 VC 添加一个按钮,并将它们连接到标题中的适当插座,并在我们的 .m 文件中综合属性。在界面生成器中,将每个按钮的 alpha 设置为零。它会消失,但它仍然存在,只是看不见而已。

我们还为用户按下每个按钮时创建了一个方法,我将在 VC1 中调用 firstButton,在 VC2 中调用 backButton。将它们连接到 button1 和 button2。

除非我们以其他方式对其进行编码,否则我们的按钮是不可见的。因此,当应用程序加载并在屏幕上看到 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.
     ];
}

就是这样!请注意,我是在 viewDidAppear 方法中执行此操作,而不是在 viewDidLoad 或 viewWillAppear 中执行此操作,因为这些发生在屏幕上显示任何内容之前,并且此时没有动画是可能的。

当用户点击 VC1 中的按钮时,我们需要将不透明度设置回零,然后将 VC2 压入堆栈。我们这样做几乎与上一个动画完全相同,但这次我们需要在完成块中更改为 VC2。如果我们使用动画: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];
                 }
 ];
}

Now we have finished all the animations for VC1. We need to copy the fade-in effect to the viewDidAppear method of VC2 (which I'm not going to copy out again but its literally the same), and the code the backButton method, which is almost exactly the same as the firstButton method, except that we are popping the view controller instead of pushing a new one:

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

Does that clear things up?

于 2012-06-30T19:50:42.630 回答
0

尝试适合您要求的不同实现。在普通视图之上使用 UIScrollView。普通视图可以包含背景图像,而 UIScrollView 可以包含页面。

于 2012-06-30T19:36:15.377 回答