2016-10-04 1 views
3

код, который я написал для iOS9, работал очень хорошо:UIAlertController цвет фона iOS10

UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"Select source" 
                    message:nil 
                  preferredStyle:UIAlertControllerStyleActionSheet]; 
    alert.view.backgroundColor = DARK_BLUE; 
    alert.view.tintColor = NEON_GREEN; 
    UIView *subview = alert.view.subviews.firstObject; 
    UIView *alertContentView = subview.subviews.firstObject; 
    alertContentView.backgroundColor = DARK_BLUE; 
    alertContentView.layer.cornerRadius = 10; 

Моя точка зрения состоит в том, что UIAlertController наследуется от UIViewController и UIViewController имеют свойство UIView, которые могут быть изменены. И это работает. Теперь это представление, унаследованное от UIViewController, имеет собственное подчинение, которое contentView отображается как предупреждение. Я могу получить к нему доступ как firstObject в массиве subviews. Теперь, почему сообщение для отправки цвета фона больше не работает? Кто-нибудь знает какое-то новое решение?

+0

https://iosdevcenters.blogspot.com/2016/05/hacking-uialertcontroller-in-swift.html –

+0

Благодарим Вас за ответ, но объяснение здесь одинаково, доступ к представлению содержимого из массива subviews. Теперь он показывает желтый цвет. Не оригинал. – Stefan

ответ

13

Для всех, кто будет врезаться в одной и той же проблемы, я нашел решение:

UIAlertController.view содержит один подвид, что только контейнер.

Это подтаблица содержит подвид, который содержит два его собственных подвидов, один контейнер, а другой слой для размытия его.

Таким образом, для цикла в цикле необходимо выполнить итерацию через два подзаголовка и изменить цвет фона обоих.

Полный код:

UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"Select source" 
                    message:nil 
                  preferredStyle:UIAlertControllerStyleActionSheet]; 
    alert.view.tintColor = NEON_GREEN; 

    UIView *firstSubview = alert.view.subviews.firstObject; 

    UIView *alertContentView = firstSubview.subviews.firstObject; 
    for (UIView *subSubView in alertContentView.subviews) { //This is main catch 
     subSubView.backgroundColor = DARK_BLUE; //Here you change background 
    } 
+1

работает в iOS 10. Спасибо. – iChirag

+0

Добро пожаловать! – Stefan

0

Я использую это:

UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Alert!" 
                     message:@"Message of alert" 
                   preferredStyle:UIAlertControllerStyleAlert]; 

     UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"Ok" 
                   style:UIAlertActionStyleDefault 
                   handler:^(UIAlertAction * action) { 

                    //Your code 
                   }]; 
     [alert addAction:defaultAction]; 

     UIView * topview = alert.view.subviews.firstObject; 
     UIView * colorView = topview.subviews.firstObject; 
     colorView.backgroundColor = [UIColor yellowColor]; 
     colorView.layer.cornerRadius = 10; 
     [self presentViewController:alert animated:YES completion:nil]; 
+0

Извините, но подход такой же, как пример кода. И я попробовал, он показывает желтый цвет, но размытый, мне нужен оригинал. – Stefan

+0

Затем я предлагаю вам реализовать свой пользовательский uialertcontroller, быстрее. – Pol

+1

Я нашел решение, проверить свой собственный ответ, он может помочь, если вы столкнетесь с одной и той же проблемой. – Stefan

3

В Swift 3,0

let FirstSubview = alertController.view.subviews.first 
    let AlertContentView = FirstSubview?.subviews.first 
    for subview in (AlertContentView?.subviews)! { 
     subview.backgroundColor = UIColor.black 
     subview.layer.cornerRadius = 10 
     subview.alpha = 1 
     subview.layer.borderWidth = 1 
     subview.layer.borderColor = UIColor.yellow.cgColor 
    } 
Смежные вопросы