Text主要總結UILabel、UITextField、UITextView、UIMenuController以及UIWebView/WKWebView相關的一些問題。
UI細節主要總結界面交互開發中遇到的一些細節問題,包括Masonry部分的問題。
動畫介紹最近用到的兩個,算是常用級別的,動畫這部分之后會專門研究總結下。
最后介紹兩個工具及三個Xcode使用設置的問題。
1.Text
(1)UILabel顯示多行文字並且文字置頂顯示
不限制UILabel的高度(寬度需要設置,確定文字何時換行),numberOfLines設為0即可(設為0表示不限制行數)。
(2)使用NSMutableAttributedString滿足個性化的顯示要求
比如對文字的行間距有要求、一行文字某幾個文字的大小、顏色有特殊要求等等,都可以通過NSMutableAttributedString來進行設置。
(3)文字換行模式
設置lineBreakMode,比如達到換行條件時按單詞來換行NSLineBreakByWordWrapping,末尾顯示省略號的NSLineBreakByTruncatingTail等。
(4)textField的clearButtonMode、placeholder、keyboardType、tintColor、tag、secureTextEntry典型應用場景
clearButtonMode,設置一鍵清空按鈕顯示模式,一般是在編輯狀態下才顯示該按鈕
placeholder/attributedPlaceholder,設置占位文本,如果對樣式有特殊要求,比如顏色等,可以設置attributedPlaceholder。
keyboardType,設置初始進入編輯狀態時,默認顯示的鍵盤類型 ,比如輸入手機號碼的地方,使用數字鍵盤UIKeyboardTypeNumberPad即可,但是實際使用時發現,如果安裝了第三方輸入法比如搜狗輸入法時,設置UIKeyboardTypeNumberPad不起作用,鍵盤仍然顯示為其他類型,設置為UIKeyboardTypePhonePad則生效,不同的是UIKeyboardTypePhonePad相對UIKeyboardTypeNumberPad而言還允許輸入*, #,但基本樣式相同。
下圖為設置UIKeyboardTypePhonePad后的鍵盤類型
tintColor,比如對textField的編輯狀態下光標的顏色有要求,設置這個屬性即可。
tag,對於一個頁面含有多個textField,常常需要在代理方法中進行區別單獨處理,使用tag屬性標明即可,textView等也是通過tag來進行區分
secureTextEntry,設置輸入字符的明暗文顯示,設置為YES輸入字符時則顯示為*,一般密碼輸入時用到,但需要注意的時,針對系統原生的textField,如果添加了一個明暗文開關按鈕,通過控制該屬性來切換顯示模式時,會有一些問題,一是切換明暗文狀態切換到暗文狀態(secureTextEntry = YES),輸入字符時之前的字符串會情況,而是暗文狀態下,結束編輯狀態在進入編輯狀態后,如果點擊刪除按鈕,會清空全部已輸入的字符。如果想切換狀態后輸入不清空,再次進入編輯狀態點擊刪除按鈕只刪除前一個字符,需要針對該屬性重寫一下textField。
(5)textField限制輸入字數
textField不像textView,代理方法中是沒有DidChange事件方法的,但是可以通過監聽UIControlEventEditingChanged達到同樣效果,進而限制輸入字數
update:iOS開發筆記12:iOS7上UITextField限制字數輸入導致崩潰問題
(6)textView更改return鍵類型並自動根據輸入情況決定改按鍵可用性
設置兩個屬性即可
(7)textView如何響應按下發送按鍵的事件
在代理方法shouldChangeTextInRange中判斷識別處理即可---- if ([text isEqualToString:@"\n"]) {...}
(8)textView實現textField中的placeholder效果
textView本身沒有該屬性,實現方法是在textView上添加一個UILabel作為placeholder,在代理方法中控制該label的顯示情況,需要注意的是,UILabel如果直接加在textView上,后續調整布局在iOS7的設備上可能會崩潰,建議將textView加在一個view上,再將UILabel加在此view上進行控制即可。
(9)textView根據輸入內容高度動態變化
寫評論時如果字數較多,則textView的高度應該要隨着內容的增加而變高,當然還要有一個高度限制,不能無限制增長。
在textView中輸入字符時動態調整高度即可,以下方法在iOS7、8、9下測試可用
還有一個需要注意的問題,當再次進入編輯狀態且存有上一次的輸入草稿時,textView的光標一般應該顯示在最后一個字的末尾
(10)使用正則表達式驗證手機號碼輸入有效性
一是判斷首位數字是否為1,二是根據現有情況判斷第二位數字有效性,三是驗證后續9個字符是否為數字
(11)自定義長按后彈出的UIMenuController
(12)UIWebView
需要注意三點,一是注意在代理方法中設置頂部狀態欄的轉圈,即[UIApplication sharedApplication].networkActivityIndicatorVisible
二是在willDisappear中需要做一些處理
三是loadRequest的時候注意忽略緩存,否則頁面可能不是最新數據
(13)WKWebView
使用的與safari一樣的引擎,iOS8及以上系統建議使用WKWebView取代UIWebView,比UIWebView好用很多,並且支持進度條顯示。
(14)獲取鍵盤高度
當輸入對象被彈出的鍵盤遮擋時,常常需要做上移操作,獲取鍵盤高度是計算移動距離的關鍵之一,可以在鍵盤通知事件中獲取其高度
2.UI交互細節
(1)根據cell顯示內容動態計算高度
需要注意的是,使用Masonry布局cell時,一定不要忽略bottom屬性,因為是根據內容撐開的大小來計算高度,才能根據cell里內容確定從頂部到底部的距離,即cell的高度。
(2)使用Masonry更新布局
如果使用mas_updateConstraints方法是更新已經設置過的布局屬性,使用mas_remakeConstraints是清除原有布局設置,重新布局。
(3)點擊空白區域關閉彈框
對點擊區域進行判斷,當點擊區域在彈框范圍外,進行關閉操作即可
(4)view的層級管理
最常用三個,一是將view移動至最上層
二是將view移動至最下層
三是將view加載到window上
(5)使用UIImageView做背景View時注意開啟userInteractionEnabled屬性
UIImageView默認userInteractionEnabled屬性為NO,需要開啟,否則在上面添加UIButton后,點擊UIButton是無法響應的,因為作為父視圖的UIImageView的userInteractionEnabled屬性為NO時,觸摸事件是不會繼續往下傳遞給子視圖的,子視圖永遠無法處理觸摸事件。
(6)UIButton點擊區域設置
比如一個很小的圖標需要支持點擊,需要注意增大UIButton的響應區域,考慮用戶的點擊體驗。
(7)SDWebImage加載進度條顯示
SDWebImage已經封裝了方法支持監控加載進度
(8)注意關閉UIPageControl的userInteractionEnabled屬性
使用輪播圖時注意關閉userInteractionEnabled屬性,否則點擊pageControl區域,小圓點index會變化。
(9)相冊處理,PHPhotoLibrary取代ALAssetsLibrary,過濾非照片類型數據
iOS8以上建議用PHPhotoLibrary,使用ALAssetsLibrary當照片數量較多時可能會加載不完全。
另外需要注意的是過濾非照片類型的數據,比如視頻等
(10)使用代碼拉伸圖片
3.兩個動畫
(1)加載等待轉圈
選取一張漸變色的加載轉圈圖片,對圖片設置動畫效果
(2)CAShapeLayer + UIBezierPath實現漸變按鈕
使用UIBezierPath畫一個矩形,控制點添加在中間,且注意最后一個點要閉合,根據滑動的距離,控制點的X坐標隨之移動變化即可
效果如下
4.其它
(1)dSYM
app使用友盟統計上線后,根據錯誤崩潰信息查找問題可以使用“dSYM ”這個工具進行跟蹤處理。
(2)Network Link Conditioner
mac上可以下載該工具來模擬網絡環境進行測試,在真機上則可以通過設置里的開發者選項找到這些工具。
(3)app啟動后頂部和底部空出黑色區域問題
由於設置啟動圖加載方式為LaunchImage,但是沒有給圖片導致,系統會根據LaunchImage尺寸來決定顯示尺寸,添加LaunchImage后正常顯示
(4)Xcode升級后,第三方插件無法使用
獲得Xcode的UUID,添加到插件對應的工程里,重新運行一遍即可正常使用。
獲取Xcode的UUID:“defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID”
(5)使用代碼塊提高效率
對於經常重復輸入的一些代碼,比如一些代理方法,布局代碼等,使用代碼塊進行管理可以提高效率,對於其中的變量,在設置代碼塊的時候,以<#變量名稱#>這樣的格式設置即可,下次使用時,編譯器就能識別出這里需要輸入值。
5.參考
(1)Text Programming Guide for iOS
(2)AssetsLibrary framework broken on iOS 8
(7)Understanding and Analyzing iOS Application Crash Reports
(8)Xcode插件 info.plist/DVTPlugInCompatibilityUUIDs
(9)dSYM 文件分析工具