又是一年苹果发布会,苹果更新了新版本的系统iOS14。就我个人来说的话系统耗电有优化,小程序类似部件化APP体验也不错,还有优化了权限提示和麦克风,摄像头采集的圆点提示。总体来说还算OK,就开发者而言就有点奔溃了。。。
1.关于KVC访问私有属性:
UIDatePicker
时间滚轮在之前是可以通过KVC来访问私有属性 设置文本颜色,字体等之类的属性 例如
[datePicker setValue:UIColor.blackColor forKey:@"textColor"];
现在已经不再可以修改文本颜色了,并且出现新的日历选择模式(新模式样式看起来不错)
通过
preferredDatePickerStyle
来控制样式。
datePicker.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];//新发现这里不会根据系统的语言变了
datePicker.preferredDatePickerStyle = UIDatePickerStyleWheels;
所以要进行定制化UIDatePicker
的可以选择自行封装UIPikerView
来进行代替,关于demo我已经完成:swift代码地址、 OC代码地址
我和我同事的讨论可能是由于出于安全行考虑,苹果开始逐步限制通过KVC方式来访问控件私有属性,毕竟经历过iOS13UITextField
私有属性访问的毒打,连夜发布版本一度让我怀疑人生,讨论过大龄程序员转行的必要性~
说说UIPageControl
这个控件在iOS14上取消了currentPageImage
属性和pageImage
属性,所以如果通过KVC继续访问将会崩溃。
[page setValue:[UIImage imageNamed:@"scroll_n"] forKeyPath:@"_pageImage"];
[page setValue:[UIImage imageNamed:@"scroll_s"] forKeyPath:@"_currentPageImage"];
你可以通过currentPageIndicatorTintColor
和pageIndicatorTintColor
来修改纯色的图片
if (@available(iOS 14 ,*)) {
page.currentPageIndicatorTintColor = UIColor.blueColor;
page.pageIndicatorTintColor = UIColor.grayColor;
}else {
[page setValue:[UIImage imageNamed:@"scroll_n"] forKeyPath:@"_pageImage"];
[page setValue:[UIImage imageNamed:@"scroll_s"] forKeyPath:@"_currentPageImage"];
}
当然苹果也推出了新属性:
/// The preferred image for indicators. Symbol images are recommended. Default is nil.
@property (nonatomic, strong, nullable) UIImage *preferredIndicatorImage API_AVAILABLE(ios(14.0));
2.UIStackView变化:
在iOS 14中,UIStackView
已从使用更改CATransformLayer
为使用CALayer
,如果在调试器中检查堆栈视图,则可以看到此信息。首次在iOS 13上运行(请注意layer属性):
(lldb) po rootStackView
<UIStackView: 0x7fdc0270b3c0; frame = (0 0; 0 0);
layer = <CATransformLayer: 0x600002de3e40>>
然后在iOS 14上,我们现在有一个CALayer
:
(lldb) po rootStackView
<UIStackView: 0x7fa253f0bdc0; frame = (0 0; 0 0);
layer = <CALayer: 0x600003339440>>
由于我们现在有一个完整的,CALayer
我们还可以设置其他属性,例如cornerRadius
在堆栈视图层上,我们可以直接为iOS 14和后备设置直接设置背景颜色和边角半径,以手动添加背景视图
if #available(iOS 14.0, *) {
stackView.backgroundColor = .systemPurple
stackView.layer.cornerRadius = 10.0
} else {
// Fallback to manually adding
// background view
}
这部分引用了 Stack View Background Color in iOS 14
3.关于UITableViewCell.contentView:
苹果公司的代码注释上写的:should be added to the content view
// Custom subviews should be added to the content view.
@property (nonatomic, readonly, strong) UIView *contentView;
所以之前我们可以直接将视图添加在cell
上:
[self addSubview:self.titleLabel];
而不是:
[self.contentView addSubview:self.titleLabel];
以后如果视图直接添加在cell
上将会导致添加的视图手势,点击事件无法生效,这个是我同事和其他人告诉我的
4.关于系统授权问题:
可以参考 iOS14 隐私适配及部分解决方案来自于没八阿哥的程序