IOS

iOS实现从通讯录中选择联系人

2021-08-23
有时候APP需要用户输入一位联系人的姓名和电话,除了用户手动输入,一般也允许用户从通讯录中选择一位联系人(图1),下面的代码就是使用系统的<AddressBookUI/AddressBookUI.h>库实现这一需求. 图1 完整代码: #import "ViewController.h" #import <AddressBookUI/AddressBookUI.h> @interface ViewController ()<ABPeoplePickerNa

Flutter Boost 混合开发框架

2021-08-23
目录 一.Flutter Boost简介 二.Flutter Boost集成 2.1 Android集成 2.2 iOS集成 三.Flutter Boost架构 四.FlutterBoost3.0更新 4.1 不入侵引擎 4.2 不区分Androidx和Support分支 4.3 双端设计统一,接口统一 4.4 支持 [打开flutter页面不再打开容器] 场景 4.5 生命周期的精准通知 4.6 其他Issue 一.Flutter Boost简介 众所周知,Flutter是一个由C++实现的F

iOS实现日历行程的增删改查

2021-08-23
前言 我们可以使用系统提供的EventKit框架来访问和操作用户的日历日程和提醒(虽然日历和提醒是两个独立的app,但是是用同一个框架来处理数据).同样地,日历和提醒的数据的数据,都是存储在同一个叫做Calendar Database的数据库中: EventKit不仅能获取已存在的日程和提醒,还能在自己的app中创建.编辑.删除用户的日程和提醒,还能添加提醒.监听变化等. 在iOS10+中,若要访问用户日程或提醒,需要在info.plist中分别添加NSRemindersUsageDescrip

iOS block循环引用详解及常见误区

2021-08-19
Block循环引用 什么情况下block会造成循环引用 ARC 情况下 block为了保证代码块内部对象不被提前释放,会对block中的对象进行强引用,就相当于持有了其中的对象,而如果此时block中的对象又持有了该block,就会造成循环引用. 常见误区 误区一.所有block都会造成循环引用 在block中,并不是所有的block都会循造成环引用,比如UIView动画block.Masonry添加约束block.AFN网络请求回调block等.     1. UIView动画block不会造

iOS手动添加新字体的步骤和踩坑记录

2021-08-10
目录 前言 字体添加 1.引入字体文件 2.配置 Info.plist 文件 3.解决添加新字体不生效问题 4.代码中设置字体 总结 前言 最近在一个日记软件,发现系统的默认字体过于丑陋,于是有了更改应用字体的想法.完成操作的过程中踩了一些小坑,写下此文记录一下,希望能对后人有所帮助. 字体添加 1.引入字体文件 直接将下载好的字体文件拖入项目中 2.配置 Info.plist 文件 在 Info.plist 文件中添加新行 "Fonts provided by application"

iOS列表上拉(平滑加载数据)自动加载数据的问题解决

2021-07-11
项目需求 我的的列表需要改变,原来的分页加载采用的是MJRefresh框架进行加载更多数据,这需要有一个上拉动作才能触发,而我的产品的意思是当快要滑动到底部时自动加载下一页数据.我自己看了一下,发现很多app都是采用这种模式. 关于MJRefresh MJRefresh中并没有这样的方法,所以这个效果不一定是MJRefresh实现的,没有实现的小伙伴就不要在MJRefresh中苦苦寻找了. 功能实现 实现方法很简单,需要用到tableView的一个代理方法,就可轻松实现.- (void)tabl

iOS实现无感知上拉加载更多功能的思路与方法

2021-07-10
目录 什么是无感知上拉加载更多 如何实现无感知上拉加载更多 网上的思路(一) 网上的思路(二) MJRefresh代码的追根朔源 总结 什么是无感知上拉加载更多 什么是无感知,这个这样理解:在网络情况正常的情况下,用户对列表进行连续的上拉时,该列表可以无卡顿不停再见新的数据. 如果要体验话,Web端很多已经做到了,比如掘金的首页,还有比如i掘金iOS的App,列表都是无感知的. 说来惭愧,写了这久的代码,还真的没有认真思考这个功能怎么实现. 如何实现无感知上拉加载更多 我在看见这位网友留言的时候

iOS tableView右侧索引视图状态获取的方法实例

2021-06-29
前言 在iPhone和其他iOS的很多程序中都会看到Table View的出现,除了一般的表格资料展示之外,设置的属性资料往往也用到Table View,Table View主要分为以下两种: Plain:这是普通的列表风格  Grouped :这是分块风格. 本文介绍的是iOS tableView右侧索引视图状态获取的相关内容,下面来看正文 需求 一图胜千言! 在触摸右侧索引栏时 需要展示对应的组号名称 手指离开时消失 实现 通过Xcode查看视图层次结构 右侧索引视图的继承关系 是这样的:

iOS获取图片区域主色的方法

2021-06-14
之前的项目有这样的需求,有一个页面可以检索一块区域内图片的主色.效果图如图所示 下面是如何获取区域主色的实现思路: 首先,我们需要从相册,或者相机去获取图片: 其次,得到图片需要截取区域图片: 然后,获取截取图片的主色. 理想中是这样的,但是有很多阻碍,得到的图片需要自适应imageView(imageView的宽高是固定的),截图的得到的区域不是自己想要的区域.这里需要将图片等比例缩放,按照ImageView的宽高. 那现在就直接上代码吧! 首先我们需要等比例缩放Image: /** * 缩放

浅谈IOS屏幕刷新ADisplayLink

2021-06-07
什么是CADisplayLink 我们在应用中创建一个新的CADisplayLink对象,把它添加到一个runloop中,并给它提供一个target和selector在屏幕刷新的时候调用. 一但CADisplayLink以特定的模式注册到runloop之后,每当屏幕需要刷新的时候,runloop就会调用CADisplayLink绑定的target上的selector,这时target可以读到CADisplayLink的每次调用的时间戳,用来准备下一帧显示需要的数据.例如一个视频应用使用时间戳来计

详解IOS WebRTC的实现原理

2021-06-06
概述 它在2011年5月开放了工程的源代码,在行业内得到了广泛的支持和应用,成为下一代视频通话的标准. WebRTC的音视频通信是基于P2P,那么什么是P2P呢? 它是点对点连接的英文缩写. P2P连接模式 一般我们传统的连接方式,都是以服务器为中介的模式: 类似http协议:客户端?服务端(当然这里服务端返回的箭头仅仅代表返回请求数据). 我们在进行即时通讯时,进行文字.图片.录音等传输的时候:客户端A?服务器?客户端B. 而点对点的连接恰恰数据通道一旦形成,中间是不经过服务端的,数据直接从一

详解如何使用ReactiveObjC

2021-06-05
概述 RAC架构框架图 信号流程 基本使用 1.基本控件 UITextField //监听文本输入 [[_textField rac_textSignal] subscribeNext:^(NSString * _Nullable x) { NSLog(@"%@",x); }]; //可根据自己想要监听的事件选择 [[_textField rac_signalForControlEvents:UIControlEventEditingChanged] subscribeNext:^(_

浅谈IOS如何对app进行安全加固

2021-06-05
防止 tweak 依附 通常来说,我们要分析一个 app,最开始一般是砸壳, $ DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /path/to/XXX.app/XXX 然后将解密之后的二进制文件扔给类似 hopper 这样的反编译器处理.直接将没有砸壳的二进制文件扔个 hopper 反编译出来的内容是无法阅读的(被苹果加密了).所以说砸壳是破解分析 app 的第一步.对于这一步的防范,有两种方式. 1.限制二进制文件头内的段 通过在 Xcode 里面工程配

分析IOS RunLoop的事件循环机制

2021-06-04
在RunLoop启动之后会发送一个通知,来告知观察者 将要处理Timer/Source0事件这样一个通知的发送 处理Source0事件 如果有Source1要处理,这时会通过一个go to语句的实现来进行代码逻辑的跳转,处理唤醒是收到的消息 如果没有Source1要处理,线程就将要休眠,同时发送一个通知,告诉观察者 然后线程进入一个用户态到内核态的切换,休眠,然后等待唤醒,唤醒的条件大约包括三种: 1.Source1 2.Timer事件 3.外部手动唤醒 线程刚被唤醒之后也要发送一个通知告诉观察

IOS小组件实现时钟按秒刷新功能

2021-05-20
引言   上一节中我们了解了IOS小组件的刷新机制,发现根本没法实现按秒刷新,但是看别的App里面有做到,以为用了什么黑科技,原来是因为系统提供了一个额外的机制实现时间的动态更新,不用走小组件的刷新机制. Text控件支持显示日期时间,下面是来自官网的代码 计算时间差 let components = DateComponents(minute: 11, second: 14) let futureDate = Calendar.current.date(byAdding: components

iOS实现逐帧动画做loading视图

2021-05-18
本文实例为大家分享了iOS实现逐帧动画做loading视图的具体代码,供大家参考,具体内容如下 我封装了一个可复用的loading视图组件,用于按照一定周期逐帧播放加载动画.代码如下: .h文件 #import <UIKit/UIKit.h> //加载状态 typedef enum { FZImageSequenceLoadingStatusStop = 1, // 停止 FZImageSequenceLoadingStatusLoading, // 加载中 FZImageSequenceLo

IO实现计算器功能

2021-05-10
本文实例为大家分享了IO实现计算器功能的具体代码,供大家参考,具体内容如下 代码: // // ViewController.m // Fraction_Calculator // // Created by 鲁军 on 2021/4/26. // #import "ViewController.h" #import "Calculator.h" @interface ViewController () @property(nonatomic,strong)IBOu

WKWebview非全屏自动播放h5视频的实现方法(Swift、OC)

2021-05-06
前言 WKWebview加载一个视频播放的h5页面时,默认是需要用户点击一下才能播放视频,且视频播放时会全屏播放.如果想要h5页面视频非全屏自动播放该怎么做呢? Swift实现 这个时候就需要设置WKWebview的configuration参数,我们先来看一下Swift的实现,代码如下: let configuration = WKWebViewConfiguration() configuration.allowsInlineMediaPlayback = true if #availabl

iOS 下的图片处理与性能优化详解

2021-04-25
图片在计算机世界中怎样被存储和表示? 图片和其他所有资源一样,在内存中本质上都是0和1的二进制数据,计算机需要将这些原始内容渲染成人眼能观察的图片,反过来,也需要将图片以合适的形式保存在存储器或者在网络上传送. 这种将图片以某种规则进行二进制编码的方式,就是图片的格式. 常见的图片格式 图片的格式有很多种,除了我们熟知的 JPG.PNG.GIF,还有Webp,BMP,TIFF,CDR 等等几十种,用于不同的场景或平台. 这些格式可以分为两大类:有损压缩和无损压缩. 有损压缩:相较于颜色,人眼对光

ios动态库和静态库的区别

2021-04-24
一.什么是库? 库是共享程序代码的方式,一般分为静态库和动态库. 静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝. 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存. 二.静态库和动态库的好处 使用静态库的好处: 1.模块化,分工合作 2.避免少量改动经常导致大量的重复编译连接 3.也可以重用,注意不是共享使用 动态库使用有如下好处: 1.使用动态库,可以将最终可执行文件体积缩小 2.使用动态库,多个应用程序共享内存中得