我正在尝试设置标签栏的动画,以便从屏幕底部下方移动到顶部,同时调整视图的高度以缩小标签栏的高度。基本上,我有一个“隐藏”标签栏,当它取消隐藏时应该动画到视图中,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)
}
答案 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()