一周随笔--15.10.27

一周新知识点记录(15.10.27)

一、不规则按钮OBShapedButton

常规按钮都是一个矩形区域,即使设置了按钮layer的cornerRadious,能响应点击事件的依旧是整个矩形区域。

OBShapedButton是开源的第三方库,直接继承自UIButton,直接使用即可。它的响应区域只限定在button的图片或者背景图片区域,周围空出的区域无法响应。注意只是响应区域缩小了,frame还是原来的frame。


 二、sendActionsForControlEvents

UIButton的实例方法,通过代码手动发送按钮的点击事件触发按钮的响应方法。


三、ios时间的时区瓜葛

代码中所有得到的NSDate都是UTC时间(国际标准时间,同GMT时间),例如打印[NSDate date],打印结果总会是UTC时间,不管设备的时区怎么更变。

那么在处理时间的时候是不是要在时区上下一番工夫呢?例如后台返回一个时间字符串,我想改变它的格式,需要做的是先得到时间字符串的date,然后重新设置格式得到新的时间字符串。之前说过所有的Date都是UTC时间,因此,打印中间得到的date会发现时间比当前慢了8小时(假设当前系统时区为东8区),那么用这个时间来生成新的string,结果会不会就慢8小时呢?答案是不会的,因为时间格式NSDateFormatter有timezone属性,这个属性的值默认为当前系统时区,因此从dete转换到string的时候,系统计算时自动地在UTC时间上加了系统时区的偏差时,所以还是原来的时间,并不会慢8小时。另外中间date慢了8小时也是根据dateFormatter的timezone值来的。

除了NSDateFormatter,日历类NSCalendar也有timeZone属性。假设现在获取到了一个日期date对应的dateComponents,打印date查看发现时间慢8小时,而打印dateComponents的hour查看,发现并不会慢8小时,打印结果就是当前小时。因为在从date->dateComponents需要借助NSCalendar对象,而calendar同样有个timeZone属性,默认也是当前系统时区,转换过程中会自动加上时区偏差小时数(时差)。

因此在时区问题上通常并不需要做多余处理。


四、关于present popoverController时的警告

若当前视图控制器的显示是add视图控制器的view是到上层视图控制器的某个view中,而不是Push到UInavagationController中或者是在UITabbarController容器中的,也就是说这个控制器未处在当前app的堆栈中,那么从这个视图控制器present另一个视图控制器或者popover会发出警告 Presenting view controllers on detached view controllers!


 五、使用UITableView+FDTemplateLayoutCell自动计算Cell高度

之前计算Cell的高度都是根据Cell内容空间逐个计算高度然后相加得到一个确定值,这样当控件数量多,或者像label这种要根据文本长度自适应高度的控件,在计算label的高度的时候也要计算文本高度才行,多么蛋疼的事!有了UITableView+FDTemplateLayoutCell,cell高度计算问题会省力很多!

 UITableView+FDTemplateLayoutCell 简单来说,一句话解决cell高度计算的问题。

在heightForRowAtIndexPath代理方法中写

return [tableView fd_heightForCellWithIdentifier:@"identifierMyCell" cacheByIndexPath:indexPath configuration:^(id cell) {
       //cell的可变内容配置 例如label的text,用来确定高度
}];

这样tableView就能自动根据cell的autoLayout情况计算出高度。

因此使用该方法的前提是cell内容控件的自动布局一定要准确。可以IB中布局也可以纯代码自动布局,个人习惯使用Masonry代码布局。 


六、判断是否是第一次使用app

[[NSUserDefaults standardUserDefaults] boolForKey:@"firstStart"]可以用来判断是否是第一次使用app

第一次启动前为NO,启动后要手动设为YES 


七、关于在UINavagationControllerUItabBarControllerview上添加视图

若直接对UINavagationController.view或者UItabBarController.view添加视图myView,对前者而言,push了一个viewController之后,myView不会被覆盖,依旧显示在屏幕最前面。对后者而言,切换viewController后,myView同样显示在老地方。


 

八、-ObjC & -all_load标识

该标识和Objective-C的一个重要特性:类别(category)有关。Unix的标准静态库实现和Objective-C的动态特性之间有一些冲突:Objective-C没有为每个函数(或者方法)定义链接符号,它只为每个类创建链接符号。这样当在一个静态库中使用类别来扩展已有类的时候,链接器不知道如何把类原有的方法和类别中的方法整合起来,就会导致你调用类别中的方法时,出现"selector not recognized",也就是找不到方法定义的错误。为了解决这个问题,引入了-ObjC标志,它的作用就是将静态库中所有的和对象相关的文件都加载进来。

-ObjC 这个flag告诉链接器把库中定义的Objective-C类和Category都加载进来。这样编译之后的app会变大(因为加载了其他的objc代码进来)。但是如果静态库中有类和category的话只有加入这个flag才行。

-all_load 这个flag是专门处理-ObjC的一个bug的。用了-ObjC以后,如果类库中只有category没有类的时候这些category还是加载不进来。变通方法就是加入-all_load或者-force-load。-all_load会强制链接器把目标文件都加载进来,即使没有objc代码。-force_load在xcode3.2后可用。但是-force_load后面必须要指定具体的文件。

转载于:https://www.cnblogs.com/lotheve/p/4915308.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值