微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

导航栏标题更改在第一次滚动时就不流畅

如何解决导航栏标题更改在第一次滚动时就不流畅

我尝试根据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 举报,一经查实,本站将立刻删除。