踩坑:UINavigationItem 动画,PHPhotos 和磁盘文件读取

UINavigationItem 动画

UINavigationItem 左右两边都能设置 UIBarButtonItem,由于 UIBarButtonItem 不是 UIView 子类,所以无法直接对其进行动画。UIBarButtonItem 有个 customView 属性,可以利用这个来动画,但是定义了这个属性后,UIBarButtonItem原本的 target-action 模式将失效,为了使其能够继续响应触摸事件,最好使用 UIButton,即能响应触摸事件,也能对其动画。
实际中,这么做还是有很多麻烦的。如果要保持 UIBarButtonItem 的外观和风格与原来一致,得需要还原度很高的图片素材:尺寸保持一致,能够响应 tintColor。很难找到这样的素材,对于不会画画的我而言,无解。比如对于 + 这个符号的 UIBarButtonItem,找不到对应的素材,在 UIButton 中利用 titleLabel 来设置,字体风格不搭。

titleView 动画

titleView scale appear and disappear

上图是一个对 titleView 进行缩放显示的动画。一般的思路是直接对 titleView 进行动画。

self.navigationItem.titleView = self.segmentedControl;
self.navigationItem.titleView.transform = CGAffineTransformMakeScale(0.1, 0.1);
[UIView animateWithDuration:0.5
                      delay:0
     usingSpringWithDamping:1
      initialSpringVelocity:1
                    options:UIViewAnimationOptionShowHideTransitionViews
                 animations:^{
                         self.navigationItem.titleView.transform = CGAffineTransformMakeScale(1, 1);
                     }
                 completion:^(BOOL finished){
                         [self.collectionView reloadData];
}];

这时候还没有问题,但是想要 titleView以同样的风格消失时,直接对 titleView 进行缩放动画的结果是缩放后比例不对,而且 titleView 的位置也移动了,甚至是相对于与leftBarButtonItem 的距离按照动画中指定的Y 轴比例进行移动的。在 stackoverflow 上有人也遇到类似问题,由于不清楚内部的实现,为了规避这个问题,方法就是将要动画的视图封装进一个 UIView 再赋值给 titleView,并只在该视图上进行动画,而不是在 titleView 上进行动画。
先封装:

UIView *backView = [[UIView alloc] initWithFrame:self.segmentedControl.bounds];
[backView addSubview:self.segmentedControl];
self.navigationItem.titleView = backView;
    /*缩放动画*/

在segmentedControl 上进行动画,不能在 backView 或是 titleView 上动画。猜测是对视图的 frame 做更改时而没有调整子视图的布局造成的,有谁能去回答一下?

UIView *backView = self.navigationItem.titleView;
UIView *segmentedControl = backView.subviews.firstObject;

[UIView animateWithDuration:0.3
                      delay:0
     usingSpringWithDamping:1
      initialSpringVelocity:1
                    options:UIViewAnimationOptionLayoutSubviews
                 animations:^{
                         segmentedControl.transform = CGAffineTransformMakeScale(0.1, 0.1);
                     }
                 completion:^(BOOL finished){
                         self.navigationItem.titleView = nil;
                         self.segmentedControl.transform = CGAffineTransformMakeScale(1, 1);
                         self.navigationItem.title = self.assetCollection.localizedTitle;
}];

PHPhotos 更新与视图更新

对相册进行操作,添加或删除照片时,通过PHPhotoLibrary 的
- (void)performChanges:(dispatch_block_t)changeBlock completionHandler:(void (^)(BOOL success, NSError *error))completionHandler
方法来提出请求。真正执行数据更新是在
- (void)photoLibraryDidChange:(PHChange *)changeInstance
这要求注册为 PHPhotoLibrary 的观察者:

[[PHPhotoLibrary sharedPhotoLibrary] registerChangeObserver:self];

在请求的方法中,completionHandler的名字误导让我以为其会在- (void)photoLibraryDidChange:(PHChange *)changeInstance执行完毕后调用,实际上它是在changeBlock 结束后在执行 changeBlock 的串行队列中调用。因此还是在- (void)photoLibraryDidChange:(PHChange *)changeInstance中更新数据的同时更新 UI 吧。好吧,这是我文档没看仔细。

磁盘文件读取(这是个老坑了)

如果你希望将图像保存在应用的 Documents 或 Library 目录下,并且希望在下次启动后使用[UIImage imageWithContentsOfFile:]从磁盘中获取图像时,不要试图保存图像文件的绝对路径。每次应用的升级会造成这个绝对路径发生变化(多谢 @千飞若逸Fee 关于这条的补充),而且从 iOS 8 开始这两个目录的不再与你的应用 Bundle 绑定,这两个目录的路径值都是动态的,每次应用启动都会是不一样的结果,见官方文档见我的提问。正确方法是,只保留文件在这两个目录下的相对路径,使用NSFileManager- URLsForDirectory:inDomains:方法来获取这两个目录的路径,再拼成绝对路径来访问。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容