gpt4 book ai didi

ios - UIView subview 的动画效果不流畅

转载 作者:可可西里 更新时间:2023-11-01 00:24:26 36 4
gpt4 key购买 nike

我正在尝试为标签栏设置动画以从屏幕底部下方移动到顶部,同时调整 View 的高度以缩小标签栏的高度。本质上,我有一个“隐藏的”标签栏,当它取消隐藏时应该以动画形式进入 View ,并且 displayView 应该根据标签栏现在占用的空间进行调整。

但是,显示 View 的动画是跳跃的。显示 View 的动画效果似乎很好,但 subview 会自动调整高度而没有任何动画效果。任何有关解决此问题的指导都将不胜感激。

我会接受 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)
}

最佳答案

当您修改 View 的大小时,它不会立即布置其 subview 。相反,它设置了一个标志,表明它需要布局。稍后,在系统完成调度最终调用 displayTabBar 的事件后,它会运行显示刷新代码。显示刷新代码找到设置了 needs-layout 标志的 View ,并告诉它们自行布局(通过向它们发送 layoutSubviews)。

在这里,您正在内部动画 block 中更改显示 View 的大小。因此,对显示 View 框架的更改将是动画的。但是它的 subview 的框架在动画 block 的之外发生变化;他们在布局阶段稍后会发生变化。您需要让它们在动画 block 的内部发生变化。

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

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()
}
}

关于ios - UIView subview 的动画效果不流畅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25921187/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com