iOS10中苹果的坑和Bug

前言

iOS10已经出来好几个月了,在开发的过程中遇到了一些Xcode的坑和iOS10中的bug,在这里记录一下。

1、UITextField输入中文后文本下移

** 触发条件 **:系统为iOS10
这是一个iOS10的bug,当你在一个xib的attributes inspector中将一个UITextField的BorderStyle设置为UITextBorderStyleNone后,在此textField中输入中文后文本将会下移。

设置BorderStyle为none

输入中文后文本下移

** 解决方法 **:
1、xib中不要设置BorderStyle,而改为在代码中设置UITextField的BorderStyle。

- (void)awakeFromNib {
    [super awakeFromNib];
    self.textField.borderStyle = UITextBorderStyleNone;
}

2、不要在xib中添加UITextField.

PS:第一种解决方法并不完美,实际上当输入的中文长度超过了textField的宽度后,文本依然会下移。

使用第一种方法后,仍然有问题

参考了各种资料后,还是没有找出最完善的解决方法,有强迫症的话就只能避免在xib中添加UITextField了,使用代码添加的UITextField是没有这个问题的。


iOS10中苹果的坑和Bug_第1张图片
只有通过xib添加的textField有这个bug

** 参考 **: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中相关的计算有些不同导致的。


iOS10中苹果的坑和Bug_第2张图片
TopBar属性改为Inferred

** 解决方法 **:
将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了。

你可能感兴趣的:(iOS10中苹果的坑和Bug)