随着iOS 12的发布,旧项目在新的Xcode中也涌现出各种各样的疑难杂症。笔者在项目开发过程中即发现UIAlertController也发生了改动。
笔者的项目需求是需要在弹窗的文本信息呈现左对齐样式,结果在iOS 12的设备上奔跑时发现,居然无效!What?经过自己的调试才发现原来是iOS 12底层对UIAlertController的Label视图取值方式变了。。。好吧,那就修改。
这是用于iOS 12之前的版本时写的代码:
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"更新提示!" message:tips preferredStyle:UIAlertControllerStyleAlert];
UIView *subView1 = alert.view.subviews[0];
UIView *subView2 = subView1.subviews[0];
UIView *subView3 = subView2.subviews[0];
UIView *subView4 = subView3.subviews[0];
UIView *subView5 = subView4.subviews[0];
//分别拿到title 和 message 可以分别设置他们的对齐属性
UILabel *title = subView5.subviews[0];
UILabel *message = subView5.subviews[1];
message.textAlignment = NSTextAlignmentLeft;
经过笔者的调试后发现是subView5的子视图数组内容产生的变化
UILabel *message = subView5.subviews[1];
需修改为
UILabel *message = subView5.subviews[2];
但是这样还要针对不同的iOS系统版本进行判断实属麻烦,所以用以下函数进行调用即可
// view: UIAlertController的视图
// message: 文本内容
// msgAlignment: 文本对齐方式
+ (void)enumrateSubviewsInView:(UIView *)view message:(NSString*)message msgAlignment:(NSTextAlignment)msgAlignment {
NSArray *subViews = view.subviews;
if (subViews.count == 0) {
return;
}
for (NSInteger i = 0; i < subViews.count; i++) {
UIView *subView = subViews[i];
[self enumrateSubviewsInView:subView message:message msgAlignment:msgAlignment];
if ([subView isKindOfClass:[UILabel class]]) {
UILabel *label = (UILabel *)subView;
if ([label.text isEqualToString:message]) {
label.textAlignment = msgAlignment;
}
}
}
}
只需简单的调用一下函数就好了,这样即可适配iOS 12和之前的系统版本啦!!!