前言
iOS10已經出來好幾個月了,在開發的過程中遇到了一些Xcode的坑和iOS10中的bug,在這里記錄一下。
1、UITextField輸入中文后文本下移
** 觸發條件 **:系統為iOS10
這是一個iOS10的bug,當你在一個xib的attributes inspector中將一個UITextField的BorderStyle
設置為UITextBorderStyleNone
后,在此textField中輸入中文后文本將會下移。
** 解決方法 **:
1、xib中不要設置BorderStyle,而改為在代碼中設置UITextField的BorderStyle。
- (void)awakeFromNib {
[super awakeFromNib];
self.textField.borderStyle = UITextBorderStyleNone;
}
2、不要在xib中添加UITextField.
PS:第一種解決方法并不完美,實際上當輸入的中文長度超過了textField的寬度后,文本依然會下移。
參考了各種資料后,還是沒有找出最完善的解決方法,有強迫癥的話就只能避免在xib中添加UITextField了,使用代碼添加的UITextField是沒有這個問題的。
** 參考 **:uitextfield-chinese-character-moves-down-when-editing-in-ios-10
2、打開xib文件后卡死
** 觸發條件 **:Xcode8.1打開特定xib文件
在開發的過程中發現使用Xcode8.1打開某些xib后,Xcode會變得異常卡頓,最后不得不強制關閉Xcode。原因是這些xib是由Xcode8.0創建并且使用了Autolayout,而且View中的TopBar屬性設置為了非Inferred,可能是因為蘋果在Xocde8.0和8.1上對xib中相關的計算有些不同導致的。
** 解決方法 **:
將xib中TopBar屬性改為Inferred后,再用8.1打開就會不卡了,但是可能會出現約束沖突,而且不能預覽xib中的具體內容的問題。約束沖突可以自行解決,不能預覽的問題只要重啟下Xcode也能解決。
3、Xcode8.0中獲取某個view的位置有問題
** 觸發條件 **:使用Xcode8.0在xib中設置Autolayout
當我們在xib中設置好每個view的約束后,正常來說在這個xib初始化后,我們就可以在-layoutSubviews
方法(在view中)或者-viewDidLayoutSubviews
方法(在viewController中)中獲取到每一個subview被約束正確計算后的位置。
但在Xcode8.0中,這是個例外,在8.0中存在一個bug:xib初始化后第一次在上述兩個方法中獲取某個被約束設置的view的frame時,返回的值會是(0, 0, 1000, 1000)
。
** 解決方法 **:
1、升級到Xcode8.1,在8.1中這個bug已經被修復了(就是這么簡單粗暴)。
2、如果你沒有升級Xcode的打算,那可以在獲取view.frame前先調用該view的-layoutIfNeeded
方法。
- (void)layoutSubviews {
[super layoutSubviews];
NSLog (self.myLabel); // 1000x1000 size
[self.myLabel layoutIfNeeded];
NSLog (self.myLabel); // normal size
}
** 參考 **:
since-xcode-8-and-ios10-views-are-not-sized-properly-on-viewdidlayoutsubviews
4、最后
總的來說,由于蘋果在iOS10中填加了在xib里面同時使用Autolayout和Autoresizing這一特性,導致出現了這幾個UI上的Bug,只能希望蘋果趕緊修復這幾個bug了。