
iOS
文章平均质量分 54
江枫夜雨
以优雅的低姿态,平视这个世界。
展开
-
UIWebView 键盘事件的处理思路以及方法
在 iOS 的项目中,经常会遇到内嵌网页的场景,而网页内的输入框也比较常见。一般来说,键盘的弹起事件和防止遮挡输入框是由前端同学处理的,但可能因为种种原因,这个锅可能甩到我们 iOS 工程师身上。锅从天而降,不接也没法。那就逆向思维,分析一下具体的实现思路吧:结果: 键盘弹出后,webView 需要上移某一个距离,保证不遮挡输入框。(如何获取正确的距离?)↓获取距离: 计算输入框距离屏幕...原创 2019-03-30 15:00:01 · 1030 阅读 · 0 评论 -
上周工作中遇到的问题以及解决方法总结
上周忙于薄荷的提交,新知识的积累不够丰富,无法连贯成一篇有质量的博文。这里分享一下上周薄荷开发中遇到的一些问题和解决办法。跳转问题在项目里有个需求,A–push–>B–push–>C, 然后想让从C 直接到D,D–pop–>A当时简单试了一下 C–pop–>A,A–push–>C.这里有两个问题,就算把C–pop–>A的动画设置为NO,还是会闪现一下A的界面,在手机不流畅的情况下会更突出。另原创 2016-04-17 00:40:32 · 3291 阅读 · 1 评论 -
ios系统中通知栏扩展开发入门
前几天看到有的应用展示在苹果手机的通知栏,突然有点感兴趣,回来在网上查询资料,发现资料少之又少,在参考了一部分资料和官方文档后,我自己试着写了一个很简单的Demo。 扩展(Extension),是ios8引入的重要功能。iOS 8系统有6个支持扩展的系统区域,分别是: Today 扩展 - 在下拉的通知中心的 “今天” 的面板中添加一个 widget;Share扩展 - 点击分享按钮后将网站或者照原创 2016-04-17 23:01:21 · 2665 阅读 · 0 评论 -
优雅的创建一个相册管理类(兼容AssetsLibrary和PhotoKit)
越来越多的app选择图片的时候,放弃iOS默认的界面,使用自定义相册去展示,并供用户选择。做到这些,肯定少不了一个获取相册分组和每个分组里的图片的类,这里要展示一下一个Mange应该做的工作。 主要有两个工作,第一,获取相册分组。第二获取每个分组里的照片信息。这里针对iOS8之前的ALAssetsLibrary 和之后的PhotoKit进行阐述。ALAssetsLibrary先陈述一下几个类的意义A原创 2016-04-24 21:54:00 · 1920 阅读 · 0 评论 -
说说断点下载
最近项目用到了断点下载,结合着项目,总结一些知识点一、数据的下载小到一次普通的get请求,大到一个电影的下载都属于数据的下载。对于数据请求,我们肯定会用到NSURLConnection或者NSURLSession。被普遍使用的AFNetWorking的 AFHTTPRequestOperationManager 是基于 NSURLConnection 的封装,而 AFHTTPSessionManag原创 2016-05-27 16:12:02 · 894 阅读 · 0 评论 -
iOS旋转 — 关于Transform的一点小事
最近在项目开发的时候,用到了transform这个属性,挺简单的一个功能,但却出现了一点困扰。归根到底还是对这个知识的熟悉程度不够。在此记录一下。基于transform的方法有三个方法 CGAffineTransformMakeTranslation 平移 CGAffineTransformMakeScale 缩放 CGAffineTransformMakeRotation原创 2016-06-11 19:12:51 · 4270 阅读 · 0 评论 -
iOS 文档预览功能
在我们的app中可能会涉及到doc,docx,pdf,xls等格式的文档预览,或者调用第三方app打开文档的功能。如果不是严格要求,使用UIWebView打开是一种最为简单快捷的方式(具体方法很简单,在此就不多做说明)。下面说的是如何使用iOS自带UIDocumentInteractionController功能。原创 2015-04-14 14:52:32 · 2261 阅读 · 2 评论 -
iOS 自定义相机
大多数app都会涉及到上传照片这个功能,图片来源无非是从相册获取或者相机拍摄。如果不是特别要求,调用系统已经满足需求。但对于特殊需求,就需要自定义相机拍摄界面了。对于无需定制的相机,使用系统的UIKit库里的UIImagePickerController类,几行代码,几个代理方法就可满足所需。但如果要深度定制,就要系统库AVFoundation内部的相关类。本文按照一个完整项目介绍自定义相机的相关原创 2016-02-20 17:43:32 · 1025 阅读 · 0 评论 -
PureAutoLayout 自动适配主要方法解析
对于开发者来着,与用户最近的距离就是通过app上的一个个界面,一个好的布局不仅能让开发者适配的工作量减少很多,也会给用户带来比较好的体验。对于自动布局,最早的就属于Autoresizing Mask,在苹果没有推出AutoLayout之前,适配工作主要就靠Autoresizing Mask去完成,但随着要求的变高,只能约束具有等级关系的两个view,对于左右同等级的视图却达不到很好的控制。iOS6之原创 2016-03-05 23:40:01 · 2202 阅读 · 0 评论 -
ReactiveCocoa 学习心得 -- 1
说到ReactiveCocoa(以下简称RAC),就算没有用过的这个框架的iOS开发者,一般也会想到几个词语,函数式编程和响应式编程以及MVVM设计模式。原创 2016-03-08 22:59:53 · 967 阅读 · 0 评论 -
ReactiveCocoa 学习心得 -- 2
在上一篇篇文章中,简单讲述了一下ReactiveCocoa集成到项目中的几种方法,环境已经具备,下面我们一起来看接触一下RAC的最基本的用法原创 2016-03-10 16:41:55 · 567 阅读 · 0 评论 -
ReactiveCocoa 学习心得 -- 3
* 上篇文章简单的介绍了RAC简单的基础方法,这篇文章继续介绍另外的几个方法和分析一下在开发中的具体应用场景 * 除了前一篇的几个方法,还有一个很基本的方法,就是 filter:bolck,先做个小实验。借用上一篇的UITextField.[[self.nameTextField.rac_textSignal filter:^BOOL(NSString *value) {原创 2016-03-26 00:50:06 · 566 阅读 · 0 评论 -
ReactiveCocoa 学习心得 -- 4
前些内容学习了对一些信号的基本操作,这里将介绍一些如何去创建信号,发送信号以及操作信号 上一篇文章中出现了这样的一句代码:RACSignal *new_signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { [subscriber sendNext:@"今天是个好日子"]; r原创 2016-04-01 20:03:54 · 754 阅读 · 0 评论 -
ReplayKit 的屏幕录制功能
苹果在 iOS 9 中新添加了 ReplayKit 库,主要作用就是 RPScreenRecorder 的屏幕录制功能。在 iOS 10 中,苹果又为 ReplayKit 添加了RPBroadcast 相关的类,主要用于视频直播。这篇文章说的是屏幕录制,以后可以研究一下苹果官方推出的的直播,还是蛮期待的。原创 2017-07-22 16:52:02 · 10023 阅读 · 2 评论 -
最近工作中遇到的问题以及解决方法总结
项目编译报错 linker command failed with exit code 1 (use -v to see invocation)对着这个错误,很常见,但引起这个错误的原因却是千奇百怪。这种错误很隐蔽,因为没有详细的错误信息提示。网上也有很多解决方案。但由于原因不一样,所以都无解。后来发现在执行 pod install 的时候,有一个警告:原创 2017-08-25 21:27:05 · 6169 阅读 · 0 评论 -
ARC环境下循环引用案例
虽然ARC环境帮助我们做了很多事情,完美的解决了大多数情况下对象的自动释放。但在使用black的情况下,如果不注意,循环引用还是会发生的,导致对象无法释放。循环引用发生不一定会造成直观的现象,但某些场景下却会带来问题,比如在某个 Controller 注册了 self 为观察者,一般会在 dealloc 中移除观察者。但如果页面无法释放,再次进入这个 Controller 就会重复注册观察者,会出现原创 2017-09-24 19:47:51 · 391 阅读 · 0 评论 -
AppleWatch 开发的一些知识总结
最近忙了一阵子Apple Watch 的开发。虽然Apple Watch 4马上就要发布了,但详细的中文开发资料还不是很多。我这里就不按照步骤走了,总结一下非常规的知识点以及个人理解。静态布局所有静态UI控件都在 Storyboard 上完成,彻底抛弃frame的概念。WatchKit 布局方式很像CSS,包括绝对布局和相对布局,支持横向排列和纵向排列,UI之间无法重叠。但可以使用 ...原创 2018-09-01 14:57:58 · 3519 阅读 · 0 评论 -
iOS12 Siri ShortCuts 应用 (二)
上一篇文章 iOS12 Siri ShortCuts 应用 (一) 主要写了通过 NSUserActivity 实现 Siri ShortCuts 的方案。具体功能就是通过用户自定义的siri 语音指令, 利用siri打开app, 完成用户想要的功能。今天这篇文章就来介绍另外一种功能,通过 Intents Extension 实现不打开app 去完成某个任务。先来看下效果: 正式开始...原创 2018-08-05 14:53:13 · 6206 阅读 · 11 评论 -
iOS12 Siri ShortCuts 应用 (一)
本文介绍 Siri ShortCuts 的应用之一,可实现的功能是: 1、通过自定义 siri 短语打开 app , 并完成你想要完成的操作。 2、根据对用户行为的记录,让系统智能预测用户行为,并给出提示。 3、app 内引导用户添加或者修改语音指令。先在项目的 plist 文件里定义 属性为 Array 的 NSUserActivityTypes,为其添加对应的属性值,比如:’com...原创 2018-07-08 18:56:27 · 5931 阅读 · 1 评论 -
iOS 视频录制流程解析
这篇文章主要介绍在 iOS 中视频录制的主要流程,以及功能细节。在 iOS 系统中,录制视频有两种方式,一种是直接利用系统封装好的 UIImagePickerController ,系统的功能呢空间,优点就是使用起来简单,缺点就是难于满足个性化 UI 和功能。主要代码如下:注意需要写在 init 方法里 self.sourceType = UIImagePickerControll...原创 2018-05-26 17:40:31 · 1891 阅读 · 0 评论 -
UITableView 聊天界面顺滑下拉刷新的技巧
正常的列表下拉请求第一页,上拉加载更多。而聊天对话中的 UITableView 与正常列表是有区别的,都是默认显示最新的对话,下拉请求更多。下拉后要处理数据源的反向拼接和定位滚动的位置。数据源拼接操作不当,就会出现数据错乱。而定位滚动如果处理不当,会出现界面闪动,定位不准确的问题。这里就按照微信的聊天下拉效果,写下代码实现:假设网络请求,获取到数据 responeData 数组:一...原创 2018-05-01 16:37:07 · 2631 阅读 · 0 评论 -
GCD案例解析
在GCD中可以通过 dispatch_get_global_queue 获取全局并发队列。也可以自己去创建队列,而已指定该队列是并发还是串行对接。下面这个例子是获取全局队列,在里面创建了三个异步的线程。dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dis...原创 2018-03-11 19:00:26 · 340 阅读 · 0 评论 -
AVPlayer 无间隔循环播放
AVPlayer 可以实现音频或者视频文件的在线播放和本地播放。最近做了一个单曲循环播放的功能。一开始选择了下面这个方法:- (void)replaceCurrentItemWithPlayerItem:(nullable AVPlayerItem *)item;但尝试后发现两首音乐无法完美衔接,中间会有一个短暂的停留,这个不太符合我们的需求。尝试在播放完后,重新创建播放器,继续播放这原创 2018-01-14 16:29:23 · 363928 阅读 · 3 评论 -
富文本点击事件-TTTAttributedLabel和YYtext的不同用法
在很多 TimeLine 的排版页面,都会用到富文本,多样式的文字展示,以及为某些特殊文字,比如@,# ,以及网址添加点击事件。这里就以为 @ 和 # 添加不同样式和点击事件 和 替换网址为某个特定图片,以及添加点击事件的功能,介绍一下主流应用的两个第三方库,TTTAttributedLabel 和 YYText 的一些用法。TTTAttributedLabel TTTAttributedL原创 2018-01-21 16:15:16 · 6292 阅读 · 0 评论 -
iOS 播放音频的几种方式
对于比较短促的声音,比如系统的推送声音和短信声音,官方要求不要超过30s。开始播放NSString *filePath = [[NSBundle mainBundle] pathForResource:@"done" ofType:@"wav"];NSURL *fileUrl = [NSURL URLWithString:filePath];SystemSoundID soundID = 0;原创 2017-12-10 17:14:36 · 15199 阅读 · 0 评论 -
iOS 分享多张图片到第三方平台
最近接到了一个分享多张图片到微信,微博,等平台的需求。项目里用的是友盟分享,但其并不支持分享多张图片。自然就想到了 UIActivityViewController ,最后分享是成功了,但在使用过程中遇到了几个坑点,记录一下:最初的方案是直接分享UIImage:self.activityViewController = [[UIActivityViewController alloc]原创 2017-11-10 21:36:05 · 3277 阅读 · 1 评论 -
iOS截图的几个场景以及解决方案
一、截取整个屏幕或者根据 frame 截取屏幕内某个固定区域二、截取整个 UITableView 或者 UIScrollView 的内容(包括屏幕外的部分)三、截图某个 UIView 的内容原创 2017-10-13 18:59:59 · 724 阅读 · 0 评论 -
UIButton 获取网络图片的排版技巧
最近在做 UI 的时候,遇到一排 button 需要通过后端来控制它的 image 和 title。但由于 Android 和 iOS 对图片要求的尺寸有差异,因此通过后端开控制图片大小比较麻烦。原创 2017-09-10 15:18:34 · 3522 阅读 · 0 评论 -
iOS里延迟的执行和取消
最近在项目中遇到了一个需要延迟执行的需求,出于习惯选择了GCD的dispatch_after这个函数。但由于项目需要某个场景下取消这个处于等待执行中的action, 当时没有找到对于的方法,就换成了performSelector afterDelay 这种方案。后来查询了一些资料,自己整理了一下。下面是iOS中的几种延迟执行方法以及取消方法。1、NSTimer NSTimer 是i原创 2016-04-08 00:29:49 · 9778 阅读 · 2 评论 -
Cell选中问题 以及 URL中文编码
记录一下这周遇到的一些问题,以及解决方案1、 UITableViewCell的选中问题- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { [super setHighlighted:highlighted animated:animated]; self.progressView.cent原创 2016-05-20 23:25:06 · 515 阅读 · 0 评论 -
Commotion框架 —— CMPedometer 统计步数的使用
对于HealthKit这个框架,很多开发者都不陌生,通过读取HealthKit我们可以获取到运动的信息。追本溯源,这些信息是由CoreMotion提供的。CoreMotion有陀螺仪和加速器的功能,里面的一些类和接口也是基于这两个功能,系统帮我们计算出来的,比如步数统计和运动状态的判断。这里说一下CoreMotion的一个类 CMPedometer。原创 2016-06-18 14:25:15 · 2327 阅读 · 0 评论 -
利用cordova生成ipa文件
1、下载安装node.js环境 官网:http://nodejs.org/2、安装cordova:sudo npm install -g cordova3.创建新项目cordova create ProjrctPath com.myproject.demo MyProject其中:第一个参数是工程目录,第二个参数是Bundle identifier, 第三个参数是显示的工程名创建完成后工程结构如原创 2016-11-05 22:31:00 · 6715 阅读 · 0 评论 -
UIActivityViewController及其自定义
UIActivityViewController 是iOS很早就推出的一个分享控制器。集成了一些和系统服务进行交互的接口。先通过它的构造方法来慢慢了解它的内部结构:- (instancetype)initWithActivityItems:(NSArray *)activityItems applicationActivities:(nullable NSArray__kindof UIA原创 2016-11-11 22:13:14 · 4090 阅读 · 0 评论 -
CocoaPods 升级的注意事项
最近在做项目的时候,执行pod install的时候,报错: [!] Unable to find a specification for DateTools (~> 1.5.0) 。很明显是一些库找不到了,估计是repo仓库需要更新了。于是执行: pod repo update,但却提示:[!] Themasterrepo requires CocoaPods 1.0.0 - (currentl原创 2016-11-20 10:53:12 · 817 阅读 · 0 评论 -
使用bundle管理多版本Cocoapods之间的协助开发
使用bundle管理多版本的Cocoapods原创 2016-11-26 19:26:29 · 4131 阅读 · 0 评论 -
The "sampleIndex" KeyPath Of CABasicAnimation
AnimationWithKeyPath 是实例化 CABasicAnimation的方法,其中iOS内部已经实现了多种多样的keypath。这里记录一下一个不常见的keypath — “sampleIndex”。该动画能把一个图片从头开始播放。如下面这样一个图片: 我们设置好一个layer。其中 MCSpriteLayer是继承与CALayer的一个开源类。CGImageRef imgRef原创 2016-12-18 16:27:08 · 390 阅读 · 0 评论 -
自定义转场动画(一)
两个Controller之间的交互,相比正常的Push和Present,转场动画是iOS里比较酷炫的一种效果,能够以各种效果平滑的切换两个不同的视图控制器。适当的运用转场动画,会让你的APP变得更加生动有趣。这篇文章会以Present为例,讲述如何自定义一个转场动画。后续会有Push,以及更复杂的转场介绍。准备:首先要两个UIViewController和一个继承与UIPercentDrivenIn原创 2017-01-08 15:45:25 · 1050 阅读 · 0 评论 -
iOS10注册推送的细节
iOS10注册推送,兼容低版本1,注册- (void)startAuthority{ if (iOSVersionGreaterThanOrEqualTo(@"10")) { UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; [cen原创 2017-01-10 23:49:18 · 376 阅读 · 0 评论 -
PhotoKit相册的性能优化
有关PhotoKit的基础知识,参考我的另一篇博文: 优雅的创建一个相册管理类。 这篇文章记录一下在实际项目中,自定义相册的优化工作。之前的文章提到过,获取照片高清原图使用下面的方法: PHImageManager *manger = [PHImageManager defaultManager]; PHImageRequestOptions * options = [[PHImage原创 2017-02-12 21:44:58 · 2364 阅读 · 0 评论 -
自定义转场动画(二)
之前介绍一篇文章 自定义转场动画(一),主要介绍了Present的转场动画。今天介绍一下有关Push的转场动画。准备:首先要两个UIViewController和一个继承与UIPercentDrivenInteractiveTransition的类。ViewController1ViewController2PushTransitionAnimatorPushTransitionAnimator原创 2017-03-05 18:51:42 · 558 阅读 · 0 评论