隨著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和之前的系統版本啦!!!