简单的代码实现的炫酷navigationbar
2024-08-31 06:33:02
动图
技术原理:
当你下拉scrollview的时候,会监听scrollview的contentOffset来调整头部背景图片的位置,通过CGAffineTransformMakeTranslation和CGAffineTransformScale实现头像的缩小。
具体代码实现:
-(void)willMoveToSuperview:(UIView *)newSuperview
{
[self.scrollView addObserver:self forKeyPath:@"contentOffset" options:(NSKeyValueObservingOptionNew) context:Nil];
self.scrollView.contentInset = UIEdgeInsetsMake(self.frame.size.height, ,, );
self.scrollView.scrollIndicatorInsets = self.scrollView.contentInset;
} -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
CGPoint newOffset = [change[@"new"] CGPointValue];
[self updateSubViewsWithScrollOffset:newOffset];
} -(void)updateSubViewsWithScrollOffset:(CGPoint)newOffset
{ float destinaOffset = -;
float startChangeOffset = -self.scrollView.contentInset.top;
newOffset = CGPointMake(newOffset.x, newOffset.y<startChangeOffset?startChangeOffset:(newOffset.y>destinaOffset?destinaOffset:newOffset.y)); float subviewOffset = self.frame.size.height-;
float newY = -newOffset.y-self.scrollView.contentInset.top;
float d = destinaOffset-startChangeOffset;
float alpha = -(newOffset.y-startChangeOffset)/d;
float imageReduce = -(newOffset.y-startChangeOffset)/(d*);
self.subTitleLabel.alpha = alpha;
self.titleLabel.alpha = alpha;
self.frame = CGRectMake(, newY, self.frame.size.width, self.frame.size.height);
self.backImageView.frame = CGRectMake(, -0.5*self.frame.size.height+(1.5*self.frame.size.height-)*(-alpha), self.backImageView.frame.size.width, self.backImageView.frame.size.height); CGAffineTransform t = CGAffineTransformMakeTranslation(,(subviewOffset-0.35*self.frame.size.height)*(-alpha));
_headerImageView.transform = CGAffineTransformScale(t,
imageReduce, imageReduce); self.titleLabel.frame = CGRectMake(, 0.6*self.frame.size.height+(subviewOffset-0.45*self.frame.size.height)*(-alpha), self.frame.size.width, self.frame.size.height*0.2);
self.subTitleLabel.frame = CGRectMake(, 0.75*self.frame.size.height+(subviewOffset-0.45*self.frame.size.height)*(-alpha), self.frame.size.width, self.frame.size.height*0.1);
}
Demo分享:
GitHub:https://github.com/ianisme/CoolNavi
最新文章
- 为 suse linux 设置程序自动启动
- IOS开发之----NSDictionary,JSON和XML互相转换
- Leetcode Linked List Cycle II
- 远程无法连接Mysql 的解决方案
- JDK的安装及部署配置(配图解)
- Android项目实战(八):列表右侧边栏拼音展示效果
- 黑马程序员_Java面向对象_内部类
- 编绎OpenJDK
- SSH WebShell: SSH在线WEB管理器安装教程 - VPS管理百科
- moodle笔记之-数据库操作
- ajax格式,需要指定交互的data类型
- oracle not in 改为 not exist
- C# 关于X86/X64/AnyCpu 的关系
- 《Java从入门到精通》学习总结4
- rman实验——测试备份压缩
- The query below helps you to locate tables without a primary key:
- BZOJ 1500/Luogu 2042 - 维修数列 - [NOI2005][Splay]
- SVN服务器搭建和使用教程
- docker部署jenkins环境
- ffmpeg笔记——UDP组播接收总结