iOS12上的UIAlertController文字样式修改

随着iOS 12的发布,旧项目在新的Xcode中也涌现出各种各样的疑难杂症。笔者在项目开发过程中即发现UIAlertController也发生了改动。


iOS12上的UIAlertController文字样式修改_第1张图片

笔者的项目需求是需要在弹窗的文本信息呈现左对齐样式,结果在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和之前的系统版本啦!!!

你可能感兴趣的:(iOS12上的UIAlertController文字样式修改)