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动画属性以获得您所追求的效果,但这些属性会为您提供"俯卧撑"效果.
只是因为缺少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)
这是一个很好的答案,但我需要进行一些调整才能得到正确的答案。
所以一般的想法是,你的滚动视图中间有一个文本,当用户向上滚动经过该文本时,你希望它成为新标题。此外,当您向下滚动时,您希望它变回默认标题。
因此,使用 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”变量是滚动视图中包含您未来标题的标签。
归档时间: |
|
查看次数: |
5587 次 |
最近记录: |