分类目录归档:iOS

UITableView动画完成回调


UITableView 刷新代码块动画执行完成的回调

[CATransaction begin];

[tableView beginUpdates];

//...

[CATransaction setCompletionBlock: ^{
    // Code to be executed upon completion
}];

[tableView insertRowsAtIndexPaths: indexPaths
                 withRowAnimation: UITableViewRowAnimationAutomatic];


[tableVi...

Read more

NSPredicate 谓词使用记录


NSPredicate类是用来定义逻辑条件约束的获取或内存中的过滤搜索。

开发中经常需要从集合中查找到某个或某些值,或者通过过滤得到想要的内容,这都是家常便饭的事儿。所以,我们常见的就是需要遍历集合,加条件判断,然后得到符合条件的结果。然而,遍历是件很耗内存的事儿,特别是在移动端开发,多重的for循环遍历,是要尽量避免的。此文主要是来介绍NSPredicate类,这种类似于SQL语句通过过滤集合内容的方式,来避免进行集合遍历的方法。

基本语法

比较运算符
  • = , == : 判断两个表达式是否相等
  • = , => : 判断左边表达式的值是否大于或等于右边表达式的值

  • <= ...

Read more

NSURLSessionConfiguration的discretionary属性


最近使用NSURLSession做下载时,配置了NSURLSessionConfiguration为backgroundSessionConfiguration, 在下载时发现拔下iPhone拔下电源后,点击下载无任何进度,连接电源后即可正常下载,最终发现是NSURLSessionConfiguration的discretionary设置为了YES导致; 此属性在官方API文档的定义为:

/* allows background tasks to be scheduled at the discretion of the system for optimal performance. *...

Read more

iOS 在循环中使用计算属性导致内存暴涨


在OC的API中使用,readonly 和 copy声明,一般都是一个计算值,而在循环体中直接使用计算属性则会大量消耗内存,此时最好的解决办法是在获取某个计算属性使用autoreleasepool来降低内存峰值, 另外autorelease的值在循环中也会大量消耗内存,当然也可以使用autoreleasepool来降低内存峰值;

高内存

低内存 下面两个测试例子

低内存:

while (true) {
        NSString *a = [[NSString alloc] initWithFormat:@"test"];
    }

高内存:

while (true) {
        N...

Read more

iOS 真机安装 WebDriverAgent


在iOS真机上安装WebDriverAgent

初始化WebDriverAgent项目

首先clone代码到本地:

git clone https://github.com/facebook/WebDriverAgent.git

clone完成后,进入文件夹,并运行引导脚本:

./Scripts/bootstrap.sh

该脚本会使用Carthage下载所有的依赖,Carthage是一个第三方包管理工具,使用npm打包响应的js文件

如果你的Mac没有安装Carthage,请先安装,不然引导脚本将无法执行完成:

brew install carthage

至此项目初始化完成

配置证书

    ...

Read more

UILongPressGestureRecognizer长按手势事件不响应


最近发现项目中有多处列表页都不能侧滑返回,公司没有产品经理,这样对于8P这样的屏幕体验非常的差, 我就添加统一的侧滑返回,期间遇到遇见一个有关长按手势不执行的问题。

问题描述:

给UITableView的cell添加了长按手势,当长按cell时UILongPressGestureRecognizer事件不响应,只有手指移动和手指松开时长按事件才会被执行

问题排查

初步判断多个手势冲突, 问题应该由添加侧滑返回的代码出现了问题,侧滑返回我使用了UINavigationController+TZPopGesture分类,通过一个方法即可实现。 查看其实现,发现它是给scrollView添加...

Read more

UITableView 设置delaysContentTouches和canCancelContentTouches引发的问题


今天在修改需求时,发现某页面拖动时存在奇怪的问题:

控制器是通过XIB搭起来的,view是UITableView类型, 问题是:当手指在tableView cell 上滑动时,tableView不响应滑动事件(不滑动),但是手指在tableView的底部(没有内容区域)时可以滑动; 当tableView在滑动中时,手指在cell上滑动tableView可以响应滑动事件,一旦滑动事件结束,再去滑动cell时,tableView又无法响应滑动事件;

解决: 首先想到的是delaysContentTouches和canCancelContentTouches属性可能会引起此问题,通过查...

Read more

iOS客户端和Django服务端之间的csrftoken


iOS客户端使用Alamofire做网络请求,后台基于django,在post请求时前端报403错误;

后台报错详情:

Forbidden (CSRF cookie not set.): /account/auth/login/
[25/Mar/2018 19:02:12] "POST /account/auth/login/ HTTP/1.1" 403 2598

这是由于没有在cookie中设置csrftoken导致的,csrf是跨站请求伪造,CSRF 攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在并未授权的情况下执行在权限保护之下的操作,由于服务端使用了...

Read more

python 项目 通过FFmpeg截取视频部分并生成gif


ffmpeg 命令
ffmpeg -ss 00:00:01 -t 3 -i 视频路径 -vf crop=iw:ih*2/3 -s 320x240 -r 7 存储的gif路径
ffmpeg参数说明:
  • -ss 00:00:01表示从视频第一秒开始截取
  • -t 表示截图3秒钟的视频
  • -vf crop=iw:ih*2/3 表示截取视频的部分区域,其中宽为视频宽度,高为原视频的2/3
  • -r 7 表示每秒帧率为7帧
  • 最后直接加上要生成的gif的路径就会把截取好的视频输出为gif了。
python代码实现:
def get_video_thumbnail_gif(file):
    path = ...

Read more

iOS使用cocoapods 安装libwebp0.6.0遇到Error installing libwebp


原文地址

可能会遇到libwebp v0.6.0 超时问题:

[!] Error installing libwebp
[!] /usr/bin/git clone https://chromium.googlesource.com/webm/libwebp /var/folders/p6/t42f8nmd7332018zm9m2s3d80000gn/T/d20180415-42656-1hjxh43 --template= --single-branch --depth 1 --branch v0.6.0

Cloning into '/var/folders/p6/t42f8nmd7...

Read more