动图

技术原理:

当你下拉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

最新文章

  1. 为 suse linux 设置程序自动启动
  2. IOS开发之----NSDictionary,JSON和XML互相转换
  3. Leetcode Linked List Cycle II
  4. 远程无法连接Mysql 的解决方案
  5. JDK的安装及部署配置(配图解)
  6. Android项目实战(八):列表右侧边栏拼音展示效果
  7. 黑马程序员_Java面向对象_内部类
  8. 编绎OpenJDK
  9. SSH WebShell: SSH在线WEB管理器安装教程 - VPS管理百科
  10. moodle笔记之-数据库操作
  11. ajax格式,需要指定交互的data类型
  12. oracle not in 改为 not exist
  13. C# 关于X86/X64/AnyCpu 的关系
  14. 《Java从入门到精通》学习总结4
  15. rman实验——测试备份压缩
  16. The query below helps you to locate tables without a primary key:
  17. BZOJ 1500/Luogu 2042 - 维修数列 - [NOI2005][Splay]
  18. SVN服务器搭建和使用教程
  19. docker部署jenkins环境
  20. ffmpeg笔记——UDP组播接收总结

热门文章

  1. 学习Swift--下标脚本
  2. java web 代码
  3. windows相关小知识
  4. 【关于JavaScript】常见表单用户名、密码不能为空
  5. [BZOJ 3282] Tree 【LCT】
  6. Cocos2d-x 2.0以上版本安装方法
  7. SVN ignores
  8. 通过 DevOps 整合开发和应用安全管道
  9. SQL server聚合函数、数学函数、字符串函数
  10. Haskell 输入和输出