当工具栏或导航栏在屏幕上或屏幕外设置动画时,可以平滑地调整导航视图的大小

时间:2013-08-06 21:40:06

标签: iphone ios objective-c uinavigationcontroller

我在屏幕上和屏幕外设置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解决问题,以便所有内容跳转,但这看起来很难看。

提前致谢。

2 个答案:

答案 0 :(得分:2)

我做了什么来创建平滑的视图转换:

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

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

[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;
}

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

如果你想要更完美的解决方案,我认为你必须为你自己实施吧,以完全控制它们的隐藏/不隐藏效果...

答案 1 :(得分:0)

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