参考:https://www.jianshu.com/p/e85bc5516949
问题所在是IOS12 UIAlertController的图层变动了.
首先看代码:
UIView *subView1 = alertControl.view.subviews[0];
UIView *subView2 = subView1.subviews[0];
UIView *subView3 = subView2.subviews[0];
UIView *subView4 = subView3.subviews[0];
UIView *subView5 = subView4.subviews[0];
//IOS12 has a more uiview in subView5.subviews
UILabel *titleView = subView5.subviews[0];
UILabel *messageView = subView5.subviews[1];
if ([titleView isMemberOfClass:[UIView class]]) {
titleView = subView5.subviews[1];
messageView = subView5.subviews[2];
}
titleView.textAlignment = NSTextAlignmentLeft;
messageView.textAlignment = NSTextAlignmentLeft;
本来这里:
UILabel *titleView = subView5.subviews[0];
UILabel *messageView = subView5.subviews[1];
是没有问题的,但是我们在ios12打印图层发现:
2018-10-22 17:13:55.718670+0800 HKTSmartHome[1969:415473] subviews (
"<UIView: 0x14de7b850; frame = (0 0; 0 0); clipsToBounds = YES; layer = <CALayer: 0x28012bae0>>",
"<UILabel: 0x14de8adc0; frame = (0 0; 0 0); text = 'Are you sure you want to ...'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x2822529e0>>",
"<UILabel: 0x14de7bc50; frame = (0 0; 0 0); text = 'Your Internet connection ...'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x282252c10>>",
"<UIView: 0x14de85530; frame = (0 0; 0 0); clipsToBounds = YES; layer = <CALayer: 0x28012bf40>>",
"<UIView: 0x14de7bf40; frame = (0 0; 0 0); clipsToBounds = YES; layer = <CALayer: 0x28012bf20>>"
)
第五层的subviews数组里面[0]是UIView而不是UILabel,发现是多了一个图层了,这就导致原来的居左布局报错了.
发现了问题,修改也很简单,就是像上面的代码,把index改成[1]就可以了,并且做一个类型判断,让IOS12以下的机型用回原来的设置.
补充1:类型判断:
// 新建一个Dog对象,其中Dog是继承自Animal的
Dog *dog = [[Dog alloc]init];
// isMemberOfClass 判断是否为本类
BOOL isDog = [dog isMemberOfClass:[Dog class]]; // 返回YES
// isKindOfClass 判断是否为本类或者子类
BOOL isAnimal = [dog isKindOfClass:[Animal class]]; // 返回YES
NSLog(@"%@",dog.class); // 打印dog的类名
补充2:系统判断:
NSString *version= [UIDevice currentDevice].systemVersion;
if(version.doubleValue >=12.0) {
// 针对 12.0 以上的iOS系统进行处理
}else{
// 针对 12.0 以下的iOS系统进行处理
}