封装了一个iOS滚动厨窗效果

效果图

请添加图片描述

背景

我们要实现如图的厨窗效果,不能通过在tableView底部添加一个背景图片的方式,因为这需要修改整个tableView的背景色为透明,影响到的范围太大,只能将这个效果局限在这个cell 中,然后通过监听tableView的滚动的方式来实现

思路

以顶部为基准,在cell距离顶部为0 的时候,
展示图片的最顶部部分,在cell距离顶部的距离大于图片高度- cell高度的时候
展示图片的最底部的部分, 在滑动的过程中改变图片的frame,达到厨窗镂空展示的视觉效果

简单来说就是,当cell 从屏幕顶部到屏幕底部移动的过程中, image 同步的 相对于cell向上偏移,直到
偏移到图片的底部位置 (因为再偏移的话,就不能撑满整个cell的高度了)

注意:我们通常指考虑图片小于整个tableView展示高度的情况, 就是说我们cell展示到tabelView底部的时候(完全展示),已经展示到图片底部了,如果有大于 tableView展示高度的情况,因为我们有限展示图片顶部的,
所以,仍然是和前面同样的逻辑.由于图片高度大于tableView展示高度,则我们cell刚好展示在底部的时候,
还没有滚动到图片的底部,我们仍让可以让图片按照原来的逻辑继续修改偏移量,直到图片完全展示在cell的底部。
这种情况也是没有任何问题的。

思路:为了达到这个效果,我们不能讲tableView的背景色修改为透明背景,因为这会影响到整个列表。

这个时候,就想到,在cell中添加一个高度和图片相同的imageView, cell的clipToBounds 设置为YES,

然后随着tableView 的滚动,修改imageView的frame, 达到厨窗镂空的效果。

我们通过仔细观看这个效果可以得知,图片的frame 是和 tableView的偏移量有关系的, 更具体的说,是和cell 在屏幕中的
距离有关系的,当cell 在屏幕顶部的时候,展示的是图片的顶部,也就是这个时候图片的的frame.origin.y = 0, 然后就是在cell在屏幕中移动的过程,图片和cell的移动是同步的, cell 到屏幕的距离变大,image的frame.origin.y 就变小(因为要向上移动), 直到图片移动到cell的底部。

通过这个过程,我们得知有两个临界值, 一个就是 cell在顶部的时候,一个就是cell距离顶部的距离和高度产(图片的高度 - cell高度)相等的时候,中间的过程,origin.y = cell距离顶部的距离

这样的话就有了下面的代码逻辑

//
//  LBShowCaseCell.m
//  LBShowCase
//
//  Created by mac on 2024/6/29.
//#import "LBShowCaseCell.h" 
#define kScreenWidth \
([[UIScreen mainScreen] respondsToSelector:@selector(nativeBounds)] ? [UIScreen mainScreen].nativeBounds.size.width/[UIScreen mainScreen].nativeScale : [UIScreen mainScreen].bounds.size.width)
#define kScreenHeight \
([[UIScreen mainScreen] respondsToSelector:@selector(nativeBounds)] ? [UIScreen mainScreen].nativeBounds.size.height/[UIScreen mainScreen].nativeScale : [UIScreen mainScreen].bounds.size.height)
#define kScreenSize \
([[UIScreen mainScreen] respondsToSelector:@selector(nativeBounds)] ? CGSizeMake([UIScreen mainScreen].nativeBounds.size.width/[UIScreen mainScreen].nativeScale,[UIScreen mainScreen].nativeBounds.size.height/[UIScreen mainScreen].nativeScale) : [UIScreen mainScreen].bounds.size)@interface LBShowCaseCell ()@property (nonatomic, strong) UIImageView *imgView;@end@implementation LBShowCaseCell- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {self.contentView.clipsToBounds = YES;[self.contentView addSubview:self.imgView];}return self;
}- (void)cellOnTableView:(UITableView *)tableView didScrollView:(UIView *)view
{CGFloat topSpace = tableView.frame.origin.y;CGRect  rect = [self convertRect:self.contentView.frame toView:view];//旧的图片FrameCGRect imageRect = self.imgView.frame;//移动if (rect.origin.y > topSpace && rect.origin.y<imageRect.size.height-self.contentView.frame.size.height + topSpace) {imageRect.origin.y = - CGRectGetMinY(rect) + topSpace;}else if (rect.origin.y>imageRect.size.height-self.contentView.frame.size.height + topSpace){imageRect.origin.y = -(imageRect.size.height - self.contentView.frame.size.height);}else if(rect.origin.y< topSpace){imageRect.origin.y = 0;}//新的图片Frameself.imgView.frame = imageRect;}- (void)awakeFromNib {[super awakeFromNib];// Initialization code
}- (void)setSelected:(BOOL)selected animated:(BOOL)animated {[super setSelected:selected animated:animated];// Configure the view for the selected state
}- (UIImageView *)imgView
{if (!_imgView) {_imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0,kScreenWidth , 0)];UIImage *image = [UIImage imageNamed:@"lgx"];CGFloat height = kScreenWidth * image.size.height / image.size.width;_imgView.image = image;_imgView.frame = CGRectMake(0, 0, kScreenWidth, height);}return _imgView;
}@end

链接: link

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/863423.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

追觅科技25届校招校招24年社招科技北森题库商业推理综合测评答题攻略、通关技巧

一、追觅科技这家公司怎么样&#xff1f; 追觅科技是一家在智能清洁家电领域表现出色的企业。 二、追觅科技待遇怎么样 追觅科技的待遇在业内具有竞争力&#xff0c;具体信息如下&#xff1a; 1. **薪酬结构**&#xff1a;根据对外经济贸易大学招生就业处发布的2023届校园招…

虹科技术丨跨越距离障碍:PCAN系列网关在远程CAN网络通信的应用潜力

来源&#xff1a;虹科技术丨跨越距离障碍&#xff1a;PCAN系列网关在远程CAN网络通信的应用潜力 原文链接&#xff1a;虹科技术 | 跨越距离障碍&#xff1a;PCAN系列网关在远程CAN网络通信的应用潜力 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; #PCAN #网关 #CA…

Flask之电子邮件

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 目录 一、使用Flask-Mail发送电子邮件 1.1、配置Flask-Mail 1.2、构建邮件数据 1.3、发送邮件 二、使用事务邮件服务SendGrid 2.1、注册SendGr…

解决:bert_score无法加载本地模型

相信很多小伙伴平时都使用内网进行工作&#xff0c;这些网络是无法连接huggingface的&#xff0c;使用魔塔加载模型网络断断续续的很容易失败。但是bert_score只接收一个模型名&#xff0c;然后自动在huggingface下载或在本地缓存加载。这个缓存跟huggingface官方缓存是不同的。…

2710.移除字符串中的尾随0

从右到左&#xff0c;找到第一个不为0的&#xff0c;然后返回字符串前面的. class Solution { public:string removeTrailingZeros(string num) {int i num.length();while(true){if (num[i-1]0){i--;}else break;}return num.substr(0, i);} };调用函数&#xff0c;string.f…

最新源支付系统源码 V7版全开源 免授权 附搭建教程

最新源支付系统源码_V7版全开源_免授权_附详细搭建教程_站长亲测 YPay是专为个人站长打造的聚合免签系统&#xff0c;拥有卓越的性能和丰富的功能。它采用全新轻量化的界面UI&#xff0c;让您能更方便快捷地解决知识付费和运营赞助的难题。同时&#xff0c;它基于高性能的thin…

TypeScript学习笔记(全)

文章目录 TypeScript入门2.编译并运行TS代码2.1.简化运行ts步骤 3.TS中的常用类型3.1.TS中的类型注解3.2.TS中的原始类型3.3.TS中的数组类型3.4.TS中的联合类型3.5.类型别名3.6.函数类型3.6.1.单独执行参数、返回值类型3.6.2.同时指定参数&#xff0c;返回值类型3.6.3.函数的vo…

网络编程:使用UDP实现数据帧的接收

目录 1、需求 2、逻辑处理 3、代码实现 4、总结 1、需求 使用java代码实现数据帧的接收需求&#xff0c;完成数据到数据库的存储。 2、逻辑处理 由于udp传输不保证数据的有序性、可靠性&#xff0c;所以在做业务开发的时候&#xff0c;要程序员自己考虑需求完善udp的缺陷。…

广东省钟表行业协会第十二届会员大会暨2024年钟表行业发展交流会

6月25日广东省钟表行业协会第十二届会员大会暨2024年钟表行业发展交流会在广州万富希尔顿酒店隆重召开。大会选举沙胜昔为广东省钟表行业协会第十二届理事会会长。 领导发言 新任会长 沙胜昔 首席荣誉会长 吴伟阳 新老会长交接仪式 本次大会&#xff0c;全国钟表大伽齐参与…

前端Web开发HTML5+CSS3+移动web视频教程 Day3 CSS 第1天

P29 - P43 从此开始进入 CSS 的学习。前面都是 HTML 的学习。 CSS 的作用&#xff1a;美化。 HTML 只是规定了网页内容有哪些&#xff0c;在网页中显示的位置默认是从上到下显示&#xff0c;还带有默认效果&#xff0c;比如超链接有颜色有下划线&#xff0c;无序列表有小圆点…

CSS Flex弹性布局

一、传统布局与flex布局 1、传统布局 2、flex布局 二、flex布局原理 1、布局原理 2、flex布局体验 三、flex布局父项常见属性 1、常见的父项属性 2、flex-direction设置主轴的方向 3、justify-content 设置主轴上的子元素排列方式 4、flex-wrap 设置子元素是否换行 …

同步的问题及解决方案

同步 同步的问题 当给狗狗食物的同时,狗狗又在吃,这会导致在运行过程中会出现食物的数据的错乱,有时候会多出数据,有时候会少出数据,这就让狗狗有时候会很吃亏,那么该如何解决呢? 实验体现 package multiThread2;public class Animal{private String name;private int…

电影票房预测管理系统设计

电影票房预测管理系统的开发涉及多个层面的设计&#xff0c;包括但不限于数据收集、数据分析、预测模型构建、用户界面设计和系统集成。以下是一个基本的系统设计框架&#xff1a; 1. 数据收集模块&#xff1a;这是整个系统的基础。需要收集的数据可能包括历史票房数据、上映电…

docker离线安装部署

docker离线安装部署 下载资源包 wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.0.tgzwget https://download.docker.com/linux/static/stable/x86_64/docker-24.0.6.tgz安装 #1、解压dockertar -zxvf docker-24.0.6.tgz#2、将解压之后的docker文…

2024年6月GESP认证图形化编程_Python_C++真题及答案

2024年6月CCF GESP认证图形化编程_Python_C真题及答案 GESP 6月认证图形化编程一级真题 GESP 6月认证图形化编程二级真题 GESP 6月认证图形化编程三级真题 GESP 6月认证图形化编程四级真题 GESP 6月认证 C 一级真题 GESP 6月认证 C 二级真题 GESP 6月认证 C 三级真题 GE…

HTML 纯页面商城(简易版)

index.html ---- <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>购物商城</ti…

Memcached安装与配置:从零开始搭建高效缓存系统

Memcached 是一个高性能、分布式内存对象缓存系统&#xff0c;用于加速动态Web应用程序&#xff0c;减轻数据库负载。本文将详细介绍如何从零开始安装和配置Memcached&#xff0c;以搭建一个高效的缓存系统。 1. Memcached简介 Memcached 是一个开源的内存缓存系统&#xff0…

二叉树从根节点出发的所有路径

二叉树从根节点出发的所有路径 看上图中 二叉树结构 从根节点出发的所有路径 如下 6->4->2->1 6->4->2->3 6->4->5 6->8->7 6->8->9 逻辑思路&#xff1a; 按照先序遍历 加 回溯法 实现 代码如下 // 调用此方法&#xff0c;将根节点传递…

上位机图像处理和嵌入式模块部署(mcu 项目1:上位机编写)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面&#xff0c;我们说过要做一个报警器。如果只是简单做一个报警器呢&#xff0c;这个基本上没有什么难度。这里&#xff0c;我们就适当提高一下…

Navicat上新啦

前言 Navicat&#xff0c;在数据库界&#xff0c;几乎是一个神奇的存在&#xff0c;似乎统治了数据库开发工具的“一片天”。且看下图&#xff1a; 红的蓝的绿的橙的…&#xff0c;可以说&#xff0c;留给它的color不多了。 那么商业BI到服务监控、从云托管到云协作&#xff…