UIView子视图不能平滑地动画

时间:2014-09-18 19:49:45

标签: ios objective-c iphone uiview swift

我正在尝试设置标签栏的动画,以便从屏幕底部下方移动到顶部,同时调整视图的高度以缩小标签栏的高度。基本上,我有一个“隐藏”标签栏,当它取消隐藏时应该动画到视图中,displayView应该调整标签栏现在占用的空间。

然而,动画对于显示视图是跳跃的。看起来显示视图动画很好,但是子视图会自动调整它们的高度而不需要任何动画。任何解决问题的方向都将受到赞赏。

我会接受objective-c或swift中的援助,因为翻译相当容易。

 //Displays tab bar with slide up animation. If animated is false, all other params are unused
        func displayTabBar(animated:Bool, duration:NSTimeInterval = 0.5, delay:NSTimeInterval = 0, options:UIViewAnimationOptions = UIViewAnimationOptions.CurveLinear, completion:((Bool) -> Void)? = nil){
            if(animated){
                UIView.animateWithDuration(duration, delay: delay, options: options, animations: {
                        self.adjustTabBarDisplayed()
                    }, completion: completion)
                UIView.animateWithDuration(duration, delay: delay, options: options, animations: {
                        self.adjustDisplayViewTabDisplayed()
                    }, completion: nil)
            }
            else{
                self.adjustTabBarDisplayed()
                self.adjustDisplayViewTabDisplayed()
            }

        }

        //Adjusts frame of tab bar to display tab bar
        private func adjustTabBarDisplayed(){
            self.tabBar.frame = CGRectMake(0,UIScreen.mainScreen().bounds.height - self.tabBar.bounds.height, self.tabBar.bounds.width, self.tabBar.bounds.height)
        }

        //Adjusts frame of display view to match displayed tab bar
        private func adjustDisplayViewTabDisplayed(){
            self.displayView.frame = CGRectMake(0,0,self.displayView.bounds.width, UIScreen.mainScreen().bounds.height - self.tabBar.bounds.height)
        }

2 个答案:

答案 0 :(得分:6)

修改视图的大小时,它不会立即显示其子视图。相反,它设置一个标志,表明它需要布局。稍后,在系统完成调度最终调用displayTabBar的事件后,它将运行显示刷新代码。显示刷新代码查找设置了需求布局标志的视图,并告诉他们将自己展开(通过发送它们layoutSubviews)。

在此处,您要更改动态显示视图的内部动画块。因此,将更改为您的显示视图框架的动画。但其子视图的帧正在改变动画块的外部;它们会在布局阶段后期进行更改。你需要让它们在动画块中更改

幸运的是,这很容易。只需在动画块中调用self.displayView.layoutIfNeeded()即可。此外,您只需要一个动画块,因为所有动画参数都相同:

func displayTabBar(animated:Bool, duration:NSTimeInterval = 0.5, delay:NSTimeInterval = 0, options:UIViewAnimationOptions = UIViewAnimationOptions.CurveLinear, completion:((Bool) -> Void)? = nil){
    if(animated){
        UIView.animateWithDuration(duration, delay: delay, options: options, animations: {
                self.adjustTabBarDisplayed()
                self.adjustDisplayViewTabDisplayed()

                // ADD THIS LINE
                self.displayView.layoutIfNeeded()
            }, completion: completion)
    }
    else{
        self.adjustTabBarDisplayed()
        self.adjustDisplayViewTabDisplayed()
    }
}

答案 1 :(得分:0)

在动画块中使用下面的代码行

scrollView.layoutIfNeeded()