0

我在屏幕上和屏幕外制作 UINavigationController 导航栏和工具栏的动画。这可以按预期工作 - 但它们之间包含的视图不会平滑地改变大小。

条形按应有的方式打开和关闭动画,但它们之间的导航视图会从缩小的尺寸(当两个条形都可见时)跳转到全屏尺寸(当它们被隐藏时)。

纯粹作为猜测,我试过这个:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:1.0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

[[self navigationController] setNavigationBarHidden:YES animated:YES];
[[self navigationController] setToolbarHidden:YES];

[UIView commitAnimations];

......但这没有任何区别。

有什么方法可以让导航视图平滑地改变大小?

我可以通过使用来解决问题,animated:NO以便一切都跳转,但这看起来很难看。

提前致谢。

4

2 回答 2

2

我为创建平滑的视图转换所做的工作:

1) 在 Interface Builder 中,基本上位于导航栏和工具栏之间的视图不应自动调整其内容(例如图片)的大小,因此我取消了 Autoresize Subviews 标志

2)然后为隐藏/取消隐藏事件创建了以下触摸处理程序。关键是使用

[UIView transitionWithView:self.view 
     duration:UINavigationControllerHideShowBarDuration
     options:UIViewAnimationOptionCurveLinear
     animations:^
     {
         /* Put other animation code here ;) */
     }];

为内置隐藏/取消隐藏动画添加额外动画的代码片段。

最初我尝试简单:隐藏/取消隐藏两个栏并让 iOS 调整内部视图的大小。结果(在模拟器上)令人失望,并不顺利。如果我只隐藏一个条,它可以很好地调整视图大小,但在代码中没有两个条。

所以这里是完整的touchBegun事件处理程序,它可以做到这一点:

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    AppDelegate *app = (AppDelegate*) [[UIApplication sharedApplication] delegate];
    if (blVisible) {
        [app.navigationController setToolbarHidden:YES animated:YES];
        [app.navigationController setNavigationBarHidden:YES animated:YES];

        [UIView transitionWithView:self.view
                          duration:UINavigationControllerHideShowBarDuration
                           options:UIViewAnimationOptionCurveLinear
                        animations:^
         {
             /* Put other animation code here ;) */
             self.img.frame = CGRectMake(0, 0, 320, 480);
         }
                        completion:^(BOOL finished)
         {
         }];


    } else {
        [app.navigationController setToolbarHidden:NO animated:YES];
        [app.navigationController setNavigationBarHidden:NO animated:YES];

        [UIView transitionWithView:self.view
                          duration:UINavigationControllerHideShowBarDuration
                           options:UIViewAnimationOptionCurveLinear
                        animations:^
         {
             /* Put other animation code here ;) */
             self.img.frame = CGRectMake(0, 0, 320, 387);
         }
                        completion:^(BOOL finished)
         {
         }];

    }
    blVisible = !blVisible;
}

一个小评论:现在很流畅,但在模拟器中我看到的是 iOS 以某种方式隐藏/取消隐藏了两个不同步的栏,因此视图调整大小的时间并不完美。请检查设备。

如果您想要更完美的解决方案,我认为您必须自己实现条形以完全控制它们的隐藏/取消隐藏效果......

于 2013-08-07T01:16:56.910 回答
0

在该动画块中,您可以尝试将中间视图的框架设置为隐藏条后应为的框架。这应该使过渡顺利。

于 2013-08-06T23:08:40.550 回答