iOS UITableView滚动头图 拉伸放大效果 (头部弹性效果) 增加iOS11支持 附有demo
今天修改日期为2017年11月25日
两个月前做了iOS11的bug修复,才对博客进行更新,见谅。
在iOS11上需要注意两个问题
1.使用UIScrollview,UITableView,UIWebView等滚动UI控件的页面造成的页面错位,会上面空白20像素(不用iPhoneX做适配情况下)
解决:
//防止顶端留出状态栏高度空白 if (@available(iOS 11.0, *)) { _tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; } else { self.automaticallyAdjustsScrollViewInsets = NO; }
(2)滚动的头部内部self.iconImageView 部分 要赋值指定的大小,不能使用约束。
在iOS11上使用约束再来回拉伸头图表现水土不服的bug(具体可以描述为 拉伸过程会出现到某个位置卡顿,或者 或者整体拉伸位置错位,或者还是会出现白条)。当然你没有这个问题最好
解决:
#pragma mark - private - (void)configSubViews { [self addSubview:self.iconImageView]; self.iconImageView.frame = self.frame;//这里不使用约束 iOS11以后有 拉伸时候适配bug // [self.iconImageView mas_makeConstraints:^(MASConstraintMaker *make) { // make.edges.equalTo(self); // }]; }
献上demo,可以在github上给我点个星星最好 ✨
========华丽分割线========
历史:
接着上一篇来讲 头图在向下的滚动拉伸时候有一个放大的效果, 这里就讲讲具体的实现过程.
理解起来也很简单,肯定就是监听了滚动过程,然后 判断滚动位移的相对位置是否满足,满足则需要拉伸处理.
这里的拉伸 一般都是相对图片的等比拉伸,不能让图片比例失调.
监听方法就是
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
首先
这个头图headerView 和 self.tableView的关系
1 可以是 addSubView的关系
2 可以是 setTableViewHead 的关系
区别 不大 1 适合 设计复杂 已经有了setTableViewHeaderView 2 适合经典设计 "headerView + tableView"
(1)设置 这个headerView 高度为 ImageViewHeight 为常亮 比如 200
(2)如果是 关系1
设置 self.tableView.contentInset = UIEdgeInsetsMake(ImageViewHeight, 0, 0, 0); 当 addSubView时候 正好headView在位置从0开始 高度为 ImageViewHeight 的位置.
如果是 关系2
直接设置 [self.tableView setTableHeaderView:headerView];
(3)需要设置 headerImageView.contentMode = UIViewContentModeScaleAspectFill; //会保证图片比例不变,但是是填充整个ImageView的
(4)监听处理
/** * 做伸缩处理 * * @param scrollView */
#pragma mark - ScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
//HF_TITLE_NAV_HEIGHT 64 是状态栏 + 导航栏的高度
CGFloat yOffset = scrollView.contentOffset.y + HF_TITLE_NAV_HEIGHT;
//拉伸处理start
if (yOffset < 0 ){
float originHeight = ImageViewHeight;
float resizeScale = - (scrollView.contentOffset.y + HF_TITLE_NAV_HEIGHT)/originHeight;
float offset = - scrollView.contentOffset.y - HF_TITLE_NAV_HEIGHT;
CGRect frame = CGRectMake(0 - (SCREEN_WIDTH * resizeScale / 2),
- offset,
round(SCREEN_WIDTH + SCREEN_WIDTH * resizeScale),
round(originHeight + originHeight * resizeScale));
self.headImageView.frame = frame; //这个 UIImageView是headerView的子视图,这样拉伸时候才不会顶部出现位移空白
headerView.frame = CGRectMake(0, 0, SCREEN_WIDTH, frame.size.height);
}
//end
}
效果:
posted on 2016-01-12 17:42 ACM_Someone like you 阅读(1331) 评论(3) 编辑 收藏 举报
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体
2014-01-12 iOS系统下 的手机屏幕尺寸 分辨率 及系统版本 总结