UI相关
文章平均质量分 79
想名真难
这个作者很懒,什么都没留下…
展开
-
iOS13 Scene适配:UIWindow窗口和导航控制器
Xcode 11创建的项目中,写入上述代码运行App,结果发现这部分代码虽然执行了,但是通过UIViewController的self.navigationController获取的导航竟然是nil。多场景窗口、SceneDelegate等只有在iOS13才可以,若要考虑iOS12及以下的运行环境,那么上述解决方案就要考虑环境版本匹配了,完整代码如下。这次iOS13的发布,其改动步子有点大了,尤其是是其多场景窗口(多任务)已经颠覆了老应用的设计基础了----数据的协同共享处理机制(本文不谈,哈哈)转载 2023-03-17 11:43:18 · 2427 阅读 · 0 评论 -
iOS换肤方案
另外ArgBuilder是链式结构,因为一个可变的参数可能通过多次调用转化而来,比如一张原始图片,需要进行裁剪,拉伸,旋转后才得到最终的图片,那么这个图片需要执行多次ArgBuilder操作,最终才得到结果图片。资源指的是颜色、字体、图片、动画等。以Color为例,系统提供创建Color的API中参数都是确定的数字,对于数字是什么我们其实不用太关心,我们需要关心的是这个Color代表的含义,比如导航栏的颜色,那么可以将这个色值映射到导航栏颜色这个key上,这样就可进行配置,进而达到动态替换的目的。转载 2023-03-11 22:21:19 · 722 阅读 · 0 评论 -
iOS UICollectionView设置组背景色
为了支持iOS7以上,实现常见不同尺寸cell自定义排序,故实现了一个UICollectionViewFlowLayout的子类,并提供了一个UICollectionViewLayout分类支持自定义拖拽手势。转载 2022-08-25 10:41:50 · 1807 阅读 · 0 评论 -
iOS 横竖屏适配
iOS横竖屏适配,确实有很多坑,当然,有些坑是系统的;而有些坑,是因为我们的无知而造成的。所以多看多学多做多理解,必然能让你学到更多,增强填坑的硬实力。而对于横竖屏适配这块,转屏并不难,难的是横竖屏布局适配。博主只是简单的说了一些思路,至于实现起来,还是要针对对应的需求来进行处理。iPad横竖屏下的代码适配iOS屏幕适配,autoResizingautoLayout和sizeClass图文详解博主私人博客@HarwordLiuhttpshttpshttps。...............原创 2022-07-17 17:26:59 · 3903 阅读 · 2 评论 -
collectionView使用reloadData和reloadItemsAtIndexPaths冲突
使用collectionView的时候, 在较短的间隔(小于0.3s)调用了reloadItemsAtIndexPaths和reloadData, 发现了只做了部分刷新,reloadData没有刷新当时使用的场景是这样的, reloadItemsAtIndexPaths的触发时机比较频繁,所以只做了局部刷新, reloadData是网络数据回来是进行的 , 但是网络回来的回调中先触发了一次局部刷新, 后触发了全部刷新, 但是在collectionView:cellForItemAtIndexPath..原创 2021-09-25 18:14:47 · 1642 阅读 · 0 评论 -
tableView/collectionView复用prepareForReuse
Cell被重用如何提前知道?可以重写cell的prepareForReuse, 官方头文件中有说明.当前已经被分配的cell如果被重用了(通常是滚动出屏幕外了),会调用cell的prepareForReuse通知cell.注意这里重写方法的时候,注意一定要调用父类方法[super prepareForReuse] .// if the cell is reusable (has a reuse identifier), this is called just before the cell is转载 2021-09-25 10:34:19 · 1069 阅读 · 0 评论 -
UIScrollView实现原理
在iOS开发中我们会大量用到UIScrollView这个控件,我们使用的UITableView/UICollectionView/UITextView都继承自它。UIScrollView的频繁使用让我对它的底层实现产生了兴趣,它到底是如何工作的?如何实现一个UIScrollView?读完本篇文章,相信你一定也可以自己实现一个简易的UIScrollView。源代码1.frame与bounds这部分请参考我之前的文章——iOS frame与bounds的区别详解2.UIScrollView实现U原创 2021-05-05 10:32:23 · 972 阅读 · 1 评论 -
frame和bounds的区别
首先,我们来看一下iOS特有的坐标系,在iOS坐标系中以左上角为坐标原点,往右为X正方向,往下是Y正方向如下图:bounds和frame都是属于CGRect类型的结构体,系统的定义如下,包含一个CGPoint(起点)和一个CGSize(尺寸)子结构体。struct CGRect { CGPoint origin; CGSize size;};origin决定了view的起点,size决定View的尺寸。1.frameframe是每个view必备的属性,表示v.转载 2021-05-04 22:57:23 · 759 阅读 · 0 评论 -
iOS触摸屏幕后发生了什么?触摸事件全家桶
好奇触摸事件是如何从屏幕转移到APP内的?困惑于Cell怎么突然不能点击了?纠结于如何实现这个奇葩响应需求?亦或是已经被响应链、手势、target-action这一系列响应触摸事件的方式折腾到不会打Hello World?现在 是时候带你上分了~ (强行YY完毕)本文主要讲解iOS触摸事件的一系列机制,涉及的问题大致包括:触摸事件由触屏生成后如何传递到当前应用? 应用接收触摸事件后如何寻找最佳响应者?实现原理? 触摸事件如何沿着响应链流动? 响应链、手势识别器、UIControl之.转载 2020-09-22 10:32:51 · 1008 阅读 · 0 评论 -
iOS事件处理,手势和UIResponder
UIResponderUIResponder是iOS中用于处理用户事件的API,可以处理触摸事件、按压事件(3D touch)、远程控制事件、硬件运动事件。可以通过touchesBegan、pressesBegan、motionBegan、remoteControlReceivedWithEvent等方法,获取到对应的回调消息。UIResponder不只用来接收事件,还可以处理和传递对应的事件,如果当前响应者不能处理,则转发给其他合适的响应者处理。应用程序通过响应者来接收和处理事件,响应者可以是继承转载 2020-12-20 21:09:26 · 568 阅读 · 0 评论 -
使用YYLabel做文本竖向展示
实现效果如下, 需求上是要做成第一个的样子,就把这部分的代码贴一下,最重要的是设置了YYLabel的verticalForm,textVerticalAlignment label.verticalForm = YES; // 文字竖向展示 label.textVerticalAlignment = YYTextVerticalAlignmentTop; // 文字置顶显示整个demo:https://github.com/guochaoshun/YYLabel...原创 2021-02-24 17:44:17 · 1526 阅读 · 0 评论 -
SDWebImage加载gif动态图原理
上面分析了不同的框架加载gif的性能。SD的性能是不错的,CPU占用很低, 而且这个框架很常见, 就想研究下SDWebImage是怎么加载gif图片的。先看调用的地方, 就是很简单的使用[imageView sd_setImageWithURL:url](之前的版本可能不支持gif,但是在5.x.x之后可以了); 或者使用工程中/沙盒里 获取到的二进制数据即可#pragma mark SD加载image- (void)testGifImage5 { UIImageView *ima..原创 2021-02-13 22:58:55 · 4218 阅读 · 0 评论 -
YYImage加载gif动态图原理
其中用到了一个宏,__FLT_EPSILON__是1.19209290E-07F, 可以认为是趋向于0对比.当传入1时,直接返回string的原值当scale传入2,或者3时, 返回的是icon@2x 或者 icon@3xstatic NSString *_NSStringByAppendingNameScale(NSString *string, CGFloat scale) { if (!string) return nil; // __FLT_EPSILON__是1...原创 2021-02-09 15:08:34 · 4010 阅读 · 0 评论 -
iOS加载gif方案及性能对比
先说最后结论,原创 2021-02-09 11:19:23 · 2777 阅读 · 1 评论 -
iOS文本绘制TextKit框架
TextKit框架介绍本项目的Demo地址:https://github.com/MonkeyiOS/TextKitDemo.gitTextKit 框架是对 Core Text 的封装,用简洁的调用方式实现了大部分 Core Text 的功能,常用的 iOS 端文本布局都可以用它来搞定。我们常用的 UILabel 、UITextField 、UITextView 文本显示控件都是基于 TextKit。pic_00TextKit 框架主要的成员对象(典型的MVC):NSTextStor转载 2020-10-30 14:31:08 · 946 阅读 · 0 评论 -
iOS 动画过程中view响应点击事件
对Core Animation来说,不管是显式动画还是隐式动画,对其设置frame都是立即设置的,比如说给一个UIView做移动动画,虽然看起来frame在持续改变,但其实它的frame已经是最终值了,这种情况下,哪怕这个UIView是UIButton的实例,其触发touch事件的范围还是最终frame的地方。比如一个Button的frame是(0,0,100,100),要把它从0,0移动到200,200,在这种情况下:1.如果你使用的是显式动画(CAKeyframeAnimation和CABasicA转载 2020-10-03 22:54:14 · 2431 阅读 · 0 评论 -
为什么必须在主线程刷新UI
在 iOS开发过程中,一直知道更新UI需要在主线程中,但也没怎么细想为什么要在主线程中,或者说为什么不能在子线程中更新UI。今天抽空自己在网上查查资料 ,了解一下这个问题。太长不看版:UIKit并不是一个线程安全的类,UI操作涉及到渲染访问各种View对象的属性,如果异步操作下会存在读写问题,而为其加锁则会耗费大量资源并拖慢运行速度。另一方面因为整个程序的起点UIApplication是在主线程进行初始化,所有的用户事件都是在主线程上进行传递(如点击、拖动),所以view只能在主线程上才能对事件进转载 2020-08-26 19:28:41 · 2234 阅读 · 1 评论 -
iOS 开发中的 Self-Manager 模式
Self-Manager源于我们团队内部的黑话,“诶?你刚去的创业公司有几个 iOS 开发啊?” “就我一个” “靠,你这是 Self-Manager 啊”最近,这个思路被我们当做了一种设计模式,即赋予一个 Widget 更大的权利,让其自己负责自己的事件。举个简单的栗子,这种负责展示头像的视图:它的职责包括:通过传入的 URL,加载并展示头像图片 显示一些附属信息,比如大V的标志 将用户点击头像的事件传递给外层的 View Controller 跳转到用户信息页面于是乎这个 Widge.转载 2020-08-20 15:52:46 · 365 阅读 · 0 评论 -
ios UI绘制原理
一、UIView的绘制流程下面我们来对这个流程进行说明:当我们调用[UIView setNeedsDisplay]方法时,并没有执行立即执行绘制工作。 而是马上调用[view.layer setNeedsDisplay]方法,给当前layer打上脏标记, 表面需要绘制了。 在当前RunLoop快要结束的时候调用layer 的display方法,来进入到当前视图的真正绘制当中。 在layer的display方法内部,系统会判断layer的layer.delegate是否实现了displayL转载 2020-08-03 10:28:00 · 513 阅读 · 0 评论 -
仿写《今日头条》的tag选择页面
在《今日头条》中,该页面是用来选择自己感兴趣的频道标签从而改变segment的。标签功能应用的需求现在也比较多,主要使用collectionview中item可以移动的方法和思路来写这样的页面。关键点 在collectionview上添加的长按手势 手势状态的变化和操作 手势开始移动的时候调用此方法,可以获取相应的datasource方法设置特殊的indexpath 能否移动,如果能移动返回的是YES ,不能移动返回的是NO- (BOOL)beginInter...转载 2020-07-03 18:46:08 · 692 阅读 · 0 评论 -
适配ios13
更新Xcode之后,新项目需求,新建项目发现多了如图1所示两个新的文件SceneDelegate.h和SceneDelegate.m运行之后发现黑屏,无论是真机还是模拟器都不行,换到iOS12的手机上则可以正常运行。查看官方文档,SceneDelegate是为了优化启动和实现iPad多任务处理功能(在ipad上同时打开多个窗口)做出的改动,将原本在AppDelegate里的生命周期相关方法和window分离出来iOS13以前:AppDelegate管理App的生命周期和UI生命周期;iOS13转载 2020-06-28 16:23:21 · 544 阅读 · 1 评论 -
iOS使用自定义字体, 本地字体
首先是最简单也普遍的做法,打包内置字符库文件:步骤如下:1.第一步找到你想用的字体的 ttf 格式。加入到你的工程的resouce目录下。2.在工程的plist中AddRow,“Fonts provided by application” ,然后添加key为item0,value为你刚才加入的testFont.ttf 。是这样,可以添加多个,使用的时候写对应字体名字就行。3.然后就可以使用了。xx.font = [UIFont fontWithName:@"fontName.转载 2020-06-09 17:37:12 · 773 阅读 · 0 评论 -
iOS开发中的各种权限获取和检查
写在前面 APP开发避免不开系统权限的问题,如何在APP以更加友好的方式向用户展示系统权限,似乎也是开发过程中值得深思的一件事; 那如何提高APP获取iOS系统权限的通过率呢?有以下几种方式:1.在用户打开APP时就向用户请求权限;2.告知用户授权权限后能够获得好处之后,再向用户请求权限;3.在绝对必要的情况下才向用户请求权限,例如:用户访问照片库时请求访问系统相册权限;4.在展示系统权限的对话框前,先向用户显示自定义的对话框,若用户选择不允许,默认无操作,若用户选择允许,再展示系统对话框。转载 2020-06-01 15:03:04 · 7221 阅读 · 0 评论 -
基于响应链的ResponderChain的交互方式
前言传统iOS的对象间交互模式就那么几种:直接property传值、delegate、KVO、block、protocol、多态、Target-Action。但是有一天我在跟同事小龙结对编程的时候,他向我介绍了一个全新的交互方式:基于ResponderChain来实现对象间交互。这种方式通过在UIResponder上挂一个category,使得事件和参数可以沿着responder chain逐步传递。这相当于借用responder chain实现了一个自己的事件传递链。这在事件需要层层传递的时候转载 2020-05-14 13:51:21 · 194 阅读 · 0 评论 -
iOS 正确的获取相册权限
获取相册权限,网上的写法,大多都感觉有点问题,不是特别完美.方案1: 直接给了返回值, 那对于PHAuthorizationStatusNotDetermined这种的,后面可能权限给了不允许, 然后还去调保存相册就会出问题. 这种方案不通过.+ (BOOL)hasPermissionForPhotoGallery { PHAuthorizationStatus status =...原创 2020-04-10 10:28:58 · 10151 阅读 · 0 评论 -
iOS 打开系统文件APP,从文件中读取
公司是做文件工具类的 App,因此在 Apple 发布新的 iOS 11 后,我司加入了需求,需要允许 App 沙盒内的文件使用 Files 管理,现找到的资料不多,除了苹果的官方文档外,这篇是一个简单入门的博客来了解如何接入 Files。让你的 App 出现在 Files 里面在你的 App 内的文件可以出现在 Files 里面之前,你必须保证你的 App 是支持 Files 中打开并且...转载 2020-02-22 21:50:59 · 18462 阅读 · 2 评论 -
UINavigationBar和UINavigationItem
今天修复了一个小bug, 由于一个viewController的右边有3个按钮,在6s这种尺寸的机型上和中间的title离得有点近了. 大致是这样 , 按钮是随便写的 , 没加图????,通过这样设置的self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView: rightView];...原创 2020-02-20 19:01:56 · 669 阅读 · 0 评论 -
iOS中设置view层级关系,Layer的zPosition属性使用
addSubview的方式,会把最后添加的view放到最上面,一般情况下,我们按照顺序添加就可以满足要求了.[self.view bringSubviewToFront:self.redView], 会把redView放到最前面 .[self.view sendSubviewToBack:self.redView]; 会把redView放到最底层.- (void)insertSubvi...原创 2020-02-17 10:44:22 · 4396 阅读 · 0 评论 -
iOS 侧滑返回手势与Scrollview冲突的解决办法
苹果在iOS7.0以后推出了一个侧滑返回手势,当导航栏Push到下一页时,可以通过侧滑手势pop到上一页,这大大提高了用户的体验度,同时增加了可玩性。然而有些时候,当你push到另一个界面后,如果该界面有Scrollview或继承于Scrollview(tableview,collectionview)的控件,这时你可能会发现返回手势失效了,这个是为什么喃?经过我多番验证,原来是这个控件拦截...转载 2020-02-09 16:17:47 · 3691 阅读 · 0 评论 -
iOS AVPlayer的一些定制
用户点击了播放视频,但是此时手机是静音状态,产品说静音状态下也需要把声音给播放出来,so~ 原文:https://www.jianshu.com/p/998709165dfd首先你要确保player的属性muted为NO,即非静音,当然NO是系统默认的。然后设置一下category即可//静音状态下播放[[AVAudioSession sharedInstance] setCateg...转载 2019-12-26 18:19:52 · 2638 阅读 · 0 评论 -
iOS使用YYLabel 点击展开和收起全文
看图说话比较清晰,点击红色标记的区域,会展开全文。相关知识点YYLabel,truncationToken NSAttributedString,YYText,YYTextHighlight我们来看一下YYLabel的属性truncationToken,是一个富文本,当Label被截断时,该富文本显示在文末,默认与UILabel显示的一样,是三个点。/** The...转载 2019-12-21 10:35:29 · 12499 阅读 · 0 评论 -
iOS-设置UITableViewCell之间的间距, 从xib中加载另一个xib,一个cell用到普通的view上
网上找到了一个奇技淫巧 . 不过管用 省事 好使 .https://blog.csdn.net/u014220518/article/details/51995989重新设置的UITableViewCell的 frame。代码如下:#import "NewsCell.h"@implementation NewsCell- (void)awakeFromNib { ...原创 2018-09-28 15:42:13 · 982 阅读 · 0 评论 -
一键修改工程中xib/Storyboard中的颜色
git地址 :https://github.com/winterwd/OneKeyChangeXIBColor 可以直接下载用(注意路径中不要有中文),感兴趣就看看文章 .2018.9.2这个改色的小工具,本来是我自己在工作中,碰到的需要解决的问题,就做了一个这样的小工具,当时仅限满足自己的需求,但是最近有简友留言,提出有bug,还提出了一些改进的意见(多谢@灯塔的焰火),本是...转载 2018-10-24 11:27:05 · 959 阅读 · 0 评论 -
ios拉伸图片某部分,九点图
UIImage提供了2种方式// create a resizable version of this image. the interior is tiled when drawn.- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets ; // the interior is resized accordin...原创 2019-03-01 18:40:27 · 1215 阅读 · 0 评论 -
ios 全屏返回手势
感谢前人的无私奉献.简书原文,优化有bar,无bar的切换前言苹果在IOS7以后给导航控制器增加了一个Pop的手势,只要手指在屏幕边缘滑动,当前的控制器的视图就会跟随你的手指移动,当用户松手后,系统会判断手指拖动出来的大小来决定是否要执行控制器的Pop操作。这个操作的想法非常好,但是系统给我们规定的范围必须是屏幕左侧边缘才可以触发,这样实际使用过程中对于有些产品会产生不便...转载 2019-04-03 10:52:00 · 8032 阅读 · 0 评论 -
ios中间大,两边小的轮播图
首先上图 , 中间大,两边小的轮播图 ,git地址 :https://github.com/guochaoshun/LunBoTu主要参考代码 : https://github.com/orzzh/WLScrollView , 这个是用scrollview做的,然后自己写的cell复用,觉得有点复杂了,所以我的例子直接用了UICollectionView里面有几个比较好的点 :...原创 2019-05-21 11:49:16 · 6050 阅读 · 2 评论 -
CADisplayLink的使用,显示屏幕帧数
在开发中我们经常会遇到使用计时器的情况,例如图片轮播,进度条的绘制等就是比较常见的应用场景.常用的计时器有CADisplayLink和NSTimer,这篇文章来讲解下CADisplayLink的具体用法和注意事项CADisplayLink概括CADisplayLink是用于同步屏幕刷新频率的计时器,当屏幕刷新的时候就会调用对应的sel,所以不需要在设置间隔时间了.CADisplayL...原创 2019-06-12 18:39:56 · 2657 阅读 · 0 评论 -
翻页动画
向右翻页的动画,以前看到了,然后没有记录又忘了,今天要用,找了好久才找到,真忧伤..... CATransition * transition=[CATransition animation]; transition.duration=0.5f; NSString *style; //@"pageCurl" @"pageUnCurl"; style=@"...原创 2019-06-11 16:27:21 · 547 阅读 · 0 评论 -
ios简单封装系统播放器,界面播放,全屏播放
使用系统的AVPlayer进行封装,有全屏播放的功能git地址 : https://github.com/guochaoshun/VideoPlayView效果展示 :本来是想用阿里云或者腾讯云的,但是看了看,在项目中没有过多的要求,自己写一个练练手也是好的 .后续有时间,补充的东西,缓存进度的展示,视频亮度的调整,视频音量的调整,全屏左右滑动调整进度.如果可以,把以前的弹幕集成进去...原创 2019-07-17 13:41:59 · 1032 阅读 · 0 评论 -
ios UIView的mask属性,view和layer的关系
mask属性 :https://www.jianshu.com/p/fe4124de3729view和layer的关系 :https://www.jianshu.com/p/9c7a23ea705b什么是mask:CALayer有一个属性叫做mask,通常被称为蒙版图层,mask类似于子视图,但却不是一个普通的子视图,它本身也是CALayer类型,具有和其他图层一样的绘制和布局属性...原创 2019-08-20 16:07:47 · 3333 阅读 · 0 评论