一周隨筆--15.10.27,隨筆--15.10.27
一周新知識點記錄(15.10.27)一、不規則按鈕OBShapedButton
常規按鈕都是一個矩形地區,即使設定了按鈕layer的cornerRadious,能響應點擊事件的依舊是整個矩形地區。
OBShapedButton是開源的第三方庫,直接繼承自UIButton,直接使用即可。它的響應地區只限定在button的圖片或者背景圖片地區,周圍空出的地區無法響應。
二、
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
七、
關於在
UINavagationController
和
UItabBarController
的
view
上添加視圖
若直接對UINavagationController.view或者UItabBarController.view添加視圖myView,對前者而言,push了一個viewController之後,myView不會被覆蓋,依舊顯示在螢幕最前面。對後者而言,切換viewController後,myView同樣顯示在老地方。