前言
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了。