- 博客(678)
- 收藏
- 关注
原创 封装了一个iOS多分区自适应宽度layout
后来遇到过几次多分区的,都是将一个collectionView放到tableViewCell 中实现的,这次为了使layout更强大,支持了多。个分区的,思路就是我们在prepare layout 获取到。每个item的frame,支持设置头部的size,支持多个分区,之前做过类似的,但是只支持一个分区,,然后创建对应的布局属性,添加到一个总的数组中。实现的思路,支持配置代理,通过代理方式设置。然后在系统方法中返回整个数组即可。分区数量和每个分区cell数量。
2025-03-30 15:29:47
356
原创 封装了一个优雅的iOS全屏侧滑返回工具
思路添加一个全屏返回手势,UIPangesturerecognizer,1 手势开始在手势开始响应的时候,将navigationController的delegate代理设置为工具类,在工具类中执行代理方法,- (nullable id )navigationController:(UINavigationController *)navigationController。
2025-03-30 14:09:12
506
原创 封装了一个支持多个分区的iOS自适应动态宽度layout
支持多分区的动态自适应宽度layout,完善了之前只支持一个分区的布局,这里直接上代码。
2025-03-28 08:29:32
302
原创 iOS 在collectionView顶部无缝插入数据效果
关闭动画效果,然后在顶部插入数据,之后在滚动到插入之前的第一个数据的位置,就达到了从视觉上插入的效果。想要达到类似抖音在顶部插入数据的效果,不能用peformbatchupdate, 因为他的回调会有延迟,这里要先调用。
2025-03-27 08:15:27
381
原创 iOS侧滑返回手势冲突处理
如果在页面总滑动横向滚动的collectionView的时候,就会执行横向collectionView的滚动,从而不执行侧滑返回的手势,这是我们不想要的结果,我们想要达到的效果是:如果我们开始滑动横向collectionView的时候,collectionView没有滑动到最左边,要正常的滑动横向collectionView,如果我们开始滚动的时候,collectionView已经滑动到最左边了,则我们希望响应侧滑手势,这样就达到了解决手势冲突的效果了。控制手势是否开始响应。
2025-03-08 13:25:01
396
原创 iOS 使用消息转发机制实现多代理功能
在iOS开发中,我们有时候会用到多代理功能,比如我们列表的埋点事件,需要我们在列表的某个特定的时机进行埋点上报,我们当然可以用最常见的做法,就是设置代理实现代理方法,然后在对应的代理方法里面进行上报,但是这样做有个问题,就是会做大量重复的工作,我们想要到达的效果是,我们只需要实现业务逻辑,而埋点操作,只需需要我们配置一下数据,就会自动进行,这样就为我们减少了大量的重复性工作。该代理中心类负责消息转发,他引用了真正的原始代理,和一个代理对象,该代理对象也实现了列表的代理方法,里面的实现只进行埋点操作。
2025-03-02 16:15:12
456
原创 iOS UICollectionViewCell 点击事件自动化埋点
通过hook UICollectionViewCell 的setSelected:方法,则新的方法中执行埋点逻辑,并调用原来的方法。
2025-03-02 15:12:48
843
原创 iOSUITableVIewCell 自动化点击埋点
思路:通过运行时hook tableViewCell的 setSelected:animated:方法,iOS 中,经常要实现UITableVIewCell 点击埋点,这里通过自动化埋点的方式进行实现。在交换的方法中实现埋点逻辑,并调用原来的实现。
2025-03-02 15:01:45
356
原创 iOS UIGestureRecgonizer自动化点击埋点
项目中很多情况下视图的点击点是通过UITapGestureRecognizer 来实现的,这个时候我们就也是可以支持自动化埋点的。通过运行时hook UITapgestureRecognizer的addTarget:action: 方法。和initWithTarget:action: 方法,在交换的方法中添加埋点的响应方法,并保留原始的响应方法,在埋点响应方法中执行埋点方法,然后调用原来的响应。
2025-03-02 14:36:23
373
原创 iOS 实现UIButton自动化点击埋点
点击埋点响应了,防止外部再次添加响应的时候,我们这里重复添加埋点响应,同时,还要hook removeTarget:action:forControlEvents方法,在该方法中记录我们绑定的点击处理次数,当次数大于0时,进行埋点上报。方法的实现, 在交换的方法中添加一个响应方法,该响应方法实现了点击埋点操作,同时要添加一个标记为,记录我们添加过。一下是我们的实现代码。
2025-03-02 11:57:53
465
原创 iOS实现一个强大的本地状态记录容器
这个时候,就需要我们记录一下本地状态在内存中,随着业务越来越复杂,要记录的状态也越来越多,如果状态都是对应同一个ID还比较好处理,如果不同的状态对应的ID都不是同一个,则管理起来比较麻烦,比如,有些情况下,我们不能根据某条数据的内容ID,而要记录到实例队形的颗粒度,这个时候,就需要我们支持不同的ID来记录本地状态了,ID,对应ID的值,data,对应我们要记录的数据,通常情况下是一个字典,对应我们要记录的状态字段和值,如下所示。有字典,字典中包含三个键: type:对应 id的类型,一下是我的处理思路,
2025-03-02 11:22:44
597
原创 iOS UIScrollView的一个特性
会出发scrollView 的 scrollViewDidScroll代理方法。1如果UIScrollView 的contentSize.height >并且最大的滚动范围就是 contentSize.height - (, 则scrollView就可以滚动,否则无法滚动。这里说的是自然滚动,就是在用户松手的情况下。
2025-01-20 20:28:47
936
原创 iOS 解决两个tableView.嵌套滚动手势冲突
这是iOS ScrollView嵌套使用时候自带的一个机制,但是这个效果是我们不想要的,我们想要的效果是我们滚动cell里面的tableView的时候,滚动到边缘,不会带动外层的tableView滚动。如果该tableView 已经滚动到边缘了,则cell中的tableView不会滚动,系统会自动处理,会执行外部的滚动,这个时候是没有问题的,符合我们的需求,cell里面的tableView (a)的时候,cell里面的tableView没有滚动到边缘,这个时候,当该a 滚动到边缘,就会带动。
2025-01-12 13:24:32
678
1
原创 iOS layer.mask 的原理
效果是:比如imageLayer有一个maskLayer作为mask(注意maskLayer可以不跟imageLayer大小一样),那maskLayer透明的地方,imageLayer就不会渲染,而是变透明,显示出imageLayer之后的内容,maskLayer不透明的地方,imageLayer就会正常渲染,显示出imageLayer本来的内容如果maskLayer比imageLayer要小,那默认的maskLayer之外的地方都是透明的,都不会渲染。由以上原理可知,如果我们想让一个视图只展示一部分,
2025-01-11 19:25:48
598
原创 iOS手势shouldBeRequiredToFailByGestureRecognizer 机制
我们在iOS的手势代理方法中看到这样三个方法其中,前面两个都是手势的代理方法,后面那个是手势的一个实例方法那么这三个方法分别是什么作用呢,从字面上看并且从苹果官方的文档上看, a shouldBeRequiredToFailByGestureRecognizer:b的含义是手势a (设置代理对象的手势) 的响应 需要手势b(其他手势)响应失败,就是只有手势b 不相应的时候,手势a才能响应我们通过如下代码进行测试。
2025-01-11 14:56:40
1133
原创 iOS 中spring动画的使用
上面的位移动画,一个是普通的动画,一个是spring动画,可以明显的看出来,spring动画在动画的前期更快一些,给人的感觉干脆,利落。app 中很多都是用的这个动画效果,让人看起来很舒服。我们先来看以下两个动画的效果。spring 动画的接口就是。我们可以通过这个图看下。
2025-01-10 21:22:54
556
2
原创 iOS实现在collectionView顶部插入数据效果
因为刷新视图就是在头部中,这个时候(头部在顶部,未展示出来),我们需要使用performBatchUpdates 刷新列表,而不能使用reloadData,因为reloadData 刷新头部的时候,会造成列表的cell偏移, 而performBatchUpdates 则不会。2 我们执行过插入数据操作之后,还要将偏移量滚动到之前展示的位置达到在页面顶部插入数据的效果,所以我们要精确的捕获到插入结束的时机,就需要用到performBatchUpdates 方法,在结束的回调中设置偏移量。
2025-01-04 20:30:03
616
原创 iOS 中performBatchUpdates 的机制
这一点,在头部不展示在当前屏幕中,但是头部高度有变化的时候,我们可以使用 performBatchUpdates 刷新头部,让用户无感知的进行头部变化。performBatchUpdates ,有什么作用呢,我们下面测试了一下,发现有两个作用。在iOS UICollectionView的使用中,会遇到这样一个方法。这一点就像reloadData的作用**,就是刷新整个列表,**
2025-01-04 20:19:55
437
原创 iOS 修改图片颜色
关键代码就是 [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]但是图片的颜色不符合我们的需求,但是又不想再切新的图片了,这个时候,我们可以使用代码的方式修改图片的颜色,达到同样的效果。需求中会遇到这种情况,就是我们需要的图片是已经有的。然后设置imageView的tintColor。
2025-01-02 21:00:48
1008
原创 实现一个iOS晃动动画
有时候在开发中, 需要我们实现一个晃动动画,达到一个提示的效果,如下图所示思路, 我们要实现的本质上是一个旋转动画,然后设置一个旋转角度,以底部中间为中心旋转,左右各有一个旋转的角度,并且旋转角度逐渐变小,动画速度逐渐变快,即时间间隔逐渐减小。
2024-12-28 19:54:21
706
原创 iOS 多个输入框弹出键盘处理
开发中遇到这样一个场景,有多个输入框而不同的输入框,需要页面向上偏移的距离不一样这个时候,需要我们在获取到键盘弹出通知的时候,需要知道我们开始进行编辑的是哪一个输入框,这个时候需要我们知道一个技术点,就是**textField的开始编辑的响应方法textFieldDidBeginEditing是比键盘弹出的通知要早的,**根据这个特性,我们就可以在开始编辑的时候,记录一个是哪一个输入框开始了,根据他的位置,设置相应的偏移量#代码。
2024-12-21 13:24:59
671
原创 iOS tableview精准刷新某个cell的某个视图,并更新cell高度
不刷新整个cell, 则可以使用以下方法 , refreshWithAlert 是。如果需要刷新某个cell 的某个视图,并需要更新cell的高度,
2024-11-16 10:55:24
293
原创 iOS 键盘弹出视图精准上移
注意,我们可以自行设置一个适当的buffer,我这里是40,就是输入框距离。1 视图精准位移,需要计算出输入框距离屏幕底部的距离,然后。计算出输入框需要上移的距离,就是整个视图需要上移的距离,键盘有一个40的距离,避免紧挨着 导致体验不佳。
2024-11-16 10:49:14
515
原创 iOS 去掉URL里面的百分号符号
使用系统方法 stringByRemovingPercentEncoding。现在由于业务需要,我们需要将字符串中的百分号去掉,
2024-11-09 22:27:14
248
原创 iOS弹出系统相册选择弹窗
注意,弹出相册选择弹窗,不需要申请相册权限, 只有将图片写入系统相册。才需要这个权限,并且,弹出系统相册弹窗的时候,要添加这个判断。
2024-10-22 08:41:36
682
1
原创 iOS 键盘弹出页面上移
通知获取到键盘的高度和键盘弹出的duration, 我们上移页面frame的时候也用这个。就是通过系统的一个通知,获取到键盘即将展示,和即将消失的时机,并通过。duration,就能产生和键盘同步移动的效果,下面是代码。在监听方法中修改视图的frame。
2024-10-16 08:29:41
565
原创 iOSTextField的一个特性
textField的一个特性就是,在我们输入的时候,如果文字过长,新输入的就会将左变的内容挤出去,新输入的是会展示出来的,但是当我们结束输入的时候,文字就会从头开始展示,最后的文字展示不下的话,就会省略。
2024-10-16 08:24:07
152
原创 记录一个IOS Button设置 imageInset之后,图片变形的问题
通过设置button.imageView.contentModel = UIViewContentModelAspectFit 来修复。
2024-10-16 08:21:35
185
原创 记录一个collectionView cellforItem 方法不执行的问题
今天遇到一个问题,就是UICollectionView 的cell展示不出来,但是itemSizeForCell。则是会执行numberOfItem。和 itemsizeForCell方法的,但是不会执行cellForItem。并且,collectionView 如果没有添加到父视图上面, 但是设置代理和 dataSource了。代理方法是执行了的,通过调试发现, 是collectionView 没有添加到父视图上,方法,由于没有添加到父视图上面,当然不会展示cell。
2024-10-16 08:19:31
170
原创 记录一个iOS内存泄漏导致的OOM
当对象的引用计数器为0时,会自动调用dealloc方法来释放对象的内存空间。即使 viewController 释放了,他的view,或者cell或者其他的属性对象是有可能没有释放的,因为可能只view自身的循环引用,而不是和控制器产生的循环引用。释放,这时候,由于view的持有者释放了,他自己的引用计数要变成0,这样一直释放最顶层的视图。由以上原理可知,当我们pop的时候,vc的引用计数变为0 了,然后。所以,由以上结果可知,是vc先释放,然后view释放的。是有可能的,我们先做一个测试,发现。
2024-10-11 21:55:10
406
原创 iOS 多次获取图片主题色不一样
以上代码在多数情况下都没有问题,但是遇到一个情况,有一张图片,下拉刷新的时候,获取到的主题色和首次获取到的不一样,然后多次下拉刷新, 又能恢复首次提取的主题色,经过反复排查,发现问题是我们提取主题色的时候设置的size过小,导致每次提取主题色的误差比较大,所以修复方法就是增大提取主题色的size,将。这一句代码中的100, 改成200就可以了。这样处理之后,每次获取到的主题色都是相同的。一个需求中,要求获取图片的主题色。
2024-10-07 11:20:09
673
原创 记录一个遇到的iOS多线程闪退
这段报错,看起来是一个正在遍历一个数组的时候,我们修改了它导致的,但是我们的代码中并没有在一个for 循环中或者 enumerate中去改变一个数组的操作,后来推测,遇到一个闪退,在开发的时候,遇到过,但是很难复现,但是偶尔还是会有出现的,就是这样一个问题。有可能是一个数组在被遍历的时候,被其他线程修改了,导致的这个问题。其他地方都是主线程在掉用,获取也是在主线程,但是新写了一个调用修改数据的地方,在自线程。但是问题出在我们其他的放的调用上,后来排查代码,确实是这个问题,下面贴出代码,方便大家借鉴。
2024-10-01 10:23:29
498
原创 iOS使用贝塞尔曲线绘制三角形
遇到一个需求,要求设置一个三角形,并且没有切图,所以只能自己绘制了,这里使用贝塞尔曲线结合CAShaperLayer绘制,直接上代码。
2024-09-30 22:26:54
289
原创 封装了一个iOS水平方向动态宽度layout
通过这句代码赋值frame。思路:就是重写自定义layout的prepare layout 方法, 在里面计算每一个item 的frame。在layoutAttributesForElementsInRect:方法中返回数组。我们有时候会遇到这样的情形,就是需要展示一些动态的标签,宽度是动态的,水平方向是一行,其实这种情况还是比较容易处理的,只是一下子想不起来,这里做了一个相关的需求,将思路和代码记录下来,方便后续的查找。还有一点,我们需要通过代理方式获取到单个item的宽度。
2024-09-30 08:21:53
856
原创 iOS 提取图片的主题色,并支持灵活提取
red < 170 && green < 170 && blue < 170 ,这就限制我们提取比较暗的色调,因为越接近250, 颜色是越亮的,当然,我们可以根据自己的实际需求自己动态的调整提取的色调。遇到一个需求,要提取图片中的色调,但还有一点特殊的需求,就是不是提取颜色最多的色调,也不是平均的色调,是图片中偏暗的色调。这就需要我们动态的调整我们提取的算法,如以上代码,要注意这句条件限制。
2024-09-28 20:34:48
651
原创 iOS 使用使用渐变色生成图片
由于我这里还有一个特殊的需求 ,就是背景图片会拉伸放大,这就需要随着列表的滚动改变 CAGradientLayer 对象的frame, 但是经过调试发现,CAGradientLayer的frame改变和图片的大小改变是有差距的,会有一个时间差,导致底部露出图片的原样,这是不符合需求的,所以,就打算使用渐变色,生成一个图片,然后添加一个透明的imageView 放在背景视图的上面,随着背景视图放大,跟着放大蒙层图片视图,这样蒙层和背景图就完美贴合了。遇到这样一个场景,需要在一个背景图上盖一张渐变色的蒙层,
2024-09-27 08:31:54
896
原创 一个场景中用到的递归算法
遇到这样一个场景,就是类似于抖音的效果,进入到个人页面,要进行多次的网络请求,直到请求到刚刚看到的那一项,这里如果不考虑时间消耗的话,可以使用递归算法,请求完一个,进行下一个请求,就是在一个方法里面调用他自己,这就涉及到了递归算法。
2024-09-21 08:58:42
165
原创 is stuck in a recursive layout loop. This can happen when self-sizing views do not return consistent
经过反复排查,发现是一个监听导致的,因为我在一个监听中去修改其他列表的偏移量,其他列表偏移量的变化又出发监听,出发自身偏移量的变化,又触发监听。导致了无尽的循环调用,代码如下。解决方法,不使用监听,一个列表滚动个的时候,外面直接调用代理方法修改其他列表的偏移量就好了。调试多个 collectionView 列表的时候,遇到如下一个报错。
2024-09-18 07:51:34
435
原创 记录一个iOS工程添加文件的问题
然后就新建一个文件夹,重新clone工程,发现跑不起来,因为我添加文件夹的时候,只是添加了引用,并没有真正的把文件夹添加进来。拖过之后,本地项目能跑了,但是远端自动化构建是失败的,并且远端报 了一个错误。遇到一个紧急问题,将工程copy了一份,然后需要将copy工程的一个文件夹。拖到现有的工程里面,由于事情紧急,就直接从工程目录中拖拽文件夹,从文件夹中添加到工程目录中,这样才是正确的。所以,又重新添加了一遍,如图。
2024-08-27 08:02:58
263
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人