过渡导航栏标题

Jac*_*cob 7 animation transition objective-c uinavigationbar ios

在名为"Luvocracy"的应用程序中,当用户在屏幕上向上滑动时,导航栏的标题会发生变化.旧标题被推高,而新标题已经过渡.我现在没有视频,但这里有一些屏幕截图:

https://www.dropbox.com/s/sns0bsxkdv7pw3l/Photo%20Apr%2008%2C%2011%2001%2005%20AM.png

https://www.dropbox.com/s/ys9a49u3dyxrlcm/Photo%20Apr%2008%2C%2011%2001%2009%20AM.png

https://www.dropbox.com/s/dlcfvfvqqov3ag7/Photo%20Apr%2008%2C%2011%2001%2013%20AM.png

如何在新的导航栏标题中设置动画或转换,如图所示?

编辑:应用程序商店中的应用程序不再可用,因此我无法上传此操作的视频.

Gav*_*ney 27

您可以使用CATransition为标题更改设置动画...但是,由于标题本身是导航栏上的私有属性,因此您需要先创建自定义标签并将其附加到导航项.

设置标题标签(这将覆盖默认导航栏的标题):

UILabel *titleLabelView = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 100.0f, 44.0f) /* auto-sized anyway */];
titleLabelView.backgroundColor = [UIColor clearColor];
titleLabelView.textAlignment = NSTextAlignmentCenter;
titleLabelView.textColor = [UIColor blackColor];
titleLabelView.font = [UIFont systemFontOfSize:16.0f];
titleLabelView.adjustsFontSizeToFitWidth = YES;
titleLabelView.text = @"@cracy123";
self.navigationItem.titleView = titleLabelView;
Run Code Online (Sandbox Code Playgroud)

然后,只要您想要更改标题的动画(假设在滚动视图委托操作上),添加CAAnimation图层并预先设置:

CATransition *animation = [CATransition animation];
animation.duration = 1.0;
animation.type = kCATransitionPush;
animation.subtype = kCATransitionFromTop;
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
[self.navigationItem.titleView.layer addAnimation:animation forKey:@"changeTitle"];

((UILabel*)self.navigationItem.titleView).text = @"JACOB K";
Run Code Online (Sandbox Code Playgroud)

显然,您可以更改CATransition动画属性以获得您所追求的效果,但这些属性会为您提供"俯卧撑"效果.

在此输入图像描述


Gli*_*gor 5

只是因为缺少Swift答案,这是Gavin答案的Swift实现:

设置自定义标题标签:

let titleLabelView = UILabel.init(frame: CGRect(x: 0, y: 0, width: 0, height: 44))
titleLabelView.backgroundColor = UIColor.clearColor()
titleLabelView.textAlignment = .Center
// this next line picks up the UINavBar tint color instead of fixing it to a particular one as in Gavin's solution
titleLabelView.textColor = UINavigationBar.appearance().tintColor
titleLabelView.font = UIFont.boldSystemFontOfSize(16.0)
titleLabelView.text = "Old Title"
self.navigationItem.titleView = titleLabelView
Run Code Online (Sandbox Code Playgroud)

这是标题动画代码:

let titleAnimation = CATransition()
titleAnimation.duration = 0.5
titleAnimation.type = kCATransitionPush
titleAnimation.subtype = kCATransitionFromTop
titleAnimation.timingFunction = CAMediaTimingFunction.init(name: kCAMediaTimingFunctionEaseInEaseOut)

navigationItem.titleView!.layer.addAnimation(titleAnimation, forKey: "changeTitle")
(navigationItem.titleView as! UILabel).text = "New Title"

// I added this to autosize the title after setting new text
(navigationItem.titleView as! UILabel).sizeToFit()
Run Code Online (Sandbox Code Playgroud)


Tra*_* M. 5

这是一个很好的答案,但我需要进行一些调整才能得到正确的答案。

所以一般的想法是,你的滚动视图中间有一个文本,当用户向上滚动经过该文本时,你希望它成为新标题。此外,当您向下滚动时,您希望它变回默认标题。

在此输入图像描述

在此输入图像描述

因此,使用 Gix 发布的代码(现已转换为 Swift 3),您可以按照以下方式完成它。

将这些变量添加到 viewController 的顶部

var didChangeTitle = false
let defaultTitle = "Default Title"
let animateUp: CATransition = {
    let animation = CATransition()
    animation.duration = 0.5
    animation.type = kCATransitionPush
    animation.subtype = kCATransitionFromTop
    animation.timingFunction = CAMediaTimingFunction.init(name: kCAMediaTimingFunctionEaseInEaseOut)
    return animation
}()
let animateDown: CATransition = {
    let animation = CATransition()
    animation.duration = 0.5
    animation.type = kCATransitionPush
    animation.subtype = kCATransitionFromBottom
    animation.timingFunction = CAMediaTimingFunction.init(name: kCAMediaTimingFunctionEaseInEaseOut)
    return animation
}()
Run Code Online (Sandbox Code Playgroud)

在 viewDidLoad 中,添加此代码以设置默认标题。

let titleLabelView = UILabel.init(frame: CGRect(x: 0, y: 0, width: 200, height: 44))
titleLabelView.backgroundColor = .clear
titleLabelView.textAlignment = .center
titleLabelView.textColor = UINavigationBar.appearance().tintColor
titleLabelView.font = UIFont.boldSystemFont(ofSize: 16)
titleLabelView.text = defaultTitle
self.navigationItem.titleView = titleLabelView
Run Code Online (Sandbox Code Playgroud)

现在,您向scrollView委托函数添加一些代码:

extension MyViewController: UIScrollViewDelegate {
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        if scrollView.contentOffset.y >= (labelName.frame.origin.y + labelName.frame.height) && !didChangeTitle {
            if let label = navigationItem.titleView as? UILabel {
                label.layer.add(animateUp, forKey: "changeTitle")
                label.text = labelName.text
            }
            didChangeTitle = true
        } else if scrollView.contentOffset.y < labelName.frame.origin.y && didChangeTitle {
            if let label = navigationItem.titleView as? UILabel {
                label.layer.add(animateDown, forKey: "changeTitle")
                label.text = defaultTitle
            }
            didChangeTitle = false
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

“labelName”变量是滚动视图中包含您未来标题的标签。