如何解决导航栏标题更改在第一次滚动时就不流畅
我尝试根据tableview的滚动偏移量为导航栏标题设置动画。我通过情节提要在导航栏的标题视图中添加了两个标签。我放置了两个标签,它们的左/上/右/下约束等于superview(标题视图),第二个标签在第一个标签的右边,但是第二个标签的alpha设置为零。而且,在视图加载后,我将第二个标签的frame.origin.y属性更改为标题视图的底部,因此用户在向上滚动到特定点之前只能看到第一个标签(titleChangeTriggerPosition) 。当用户向上滚动到特定点(titleChangeTriggerPosition)时,第二个标签开始向上移动,并且其alpha值开始从0上升到1。同时,第一个标签开始向上移动,并且其alpha值开始从1降到0。
下面是我的代码,似乎工作正常。但是,这并不完美,因为我注意到在第一个滚动条上从第一个标签到第二个标签的过渡速度突然变大。我的意思是,当我第一次向上滚动时,过渡不会像下一次滚动时那样平滑。在第一个滚动条上做出怪异的反应后,滚动条变得非常平滑。在我看来,当以编程方式更改Y位置时,自动布局约束可能会“初始”互相打架(?)?我花了很多时间试图解决这个问题,但无济于事...非常感谢您的想法。预先感谢。
guard let unwrap = navigationController?.navigationBar.bounds else { return }
let titleChangeTriggerPosition: CGFloat = isBuildingList ? 270 : 310
let titleChangeDuration: CGFloat = isBuildingList ? 51.5 : 41
let labelOnetransitionSpeed: CGFloat = titleViewLabelOne.bounds.height / titleChangeDuration
let labelTwotransitionSpeed: CGFloat = titleViewLabelTwo.bounds.height / titleChangeDuration
let labelTwoTopMargin = (unwrap.height - titleViewLabelTwo.bounds.height) * 0.5
let LabelOneMaxOffsetDelta = unwrap.height
let LabelTwoMaxOffsetDelta = unwrap.height - labelTwoTopMargin
if offset > titleChangeTriggerPosition && titleChangeComplete == false {
// Label One
var labelOneOffsetDelta = (offset - titleChangeTriggerPosition) * labelOnetransitionSpeed
var labelOneAlpha = 1 - labelOneOffsetDelta / LabelOneMaxOffsetDelta
if labelOneAlpha < 0 {
labelOneAlpha = 0
}
titleViewLabelOne.alpha = min(1,labelOneAlpha)
if labelOneOffsetDelta > LabelOneMaxOffsetDelta {
labelOneOffsetDelta = LabelOneMaxOffsetDelta
}
titleViewLabelOne.frame.origin.y = min(-labelOneOffsetDelta,0)
// Label Two
var labelTwoOffsetDelta = (offset - titleChangeTriggerPosition) * labelTwotransitionSpeed
var labelTwoAlpha = labelTwoOffsetDelta / LabelTwoMaxOffsetDelta
if labelTwoAlpha > 1 {
labelTwoAlpha = 1
}
titleViewLabelTwo.alpha = min(1,labelTwoAlpha)
if labelTwoOffsetDelta > LabelOneMaxOffsetDelta {
labelTwoOffsetDelta = LabelOneMaxOffsetDelta
}
titleViewLabelTwo.frame.origin.y = max(titleTwoBeginningPosition - labelTwoOffsetDelta,0)
if titleViewLabelTwo.frame.origin.y == 0 && titleViewLabelTwo.alpha == 1 {
titleChangeComplete = true
}
}
if offset < titleChangeTriggerPosition + titleChangeDuration {
titleChangeComplete = false
}
if offset < titleChangeTriggerPosition {
titleViewLabelOne.frame.origin.y = 0
titleViewLabelTwo.frame.origin.y = titleTwoBeginningPosition
titleViewLabelOne.alpha = 1
titleViewLabelTwo.alpha = 0
titleChangeComplete = false
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。