Как изменить цвет фона UIAlertController?

Из-за странного поведения UIActionSheet в iOS 8 я реализовал UIAlertController с UIAction как кнопки в нем. Я хотел бы изменить весь фон UIAlertController. Но я не могу найти способ сделать это.

Пробовал даже с,

actionController.view.backgroundColor = [UIColor blackColor]; 

Но не помог мне. Любые материалы в этом отношении будут заметны.

Заранее спасибо.

9 Solutions collect form web for “Как изменить цвет фона UIAlertController?”

Вам нужно сделать несколько шагов глубже:

 let subview = actionController.view.subviews.first! as UIView let alertContentView = subview.subviews.first! as UIView alertContentView.backgroundColor = UIColor.blackColor() 

И, возможно, вы хотите сохранить оригинальный угловой радиус:

  alertContentView.layer.cornerRadius = 5; 

Извините за «Swifting», но я не знаком с Objective-C. Надеюсь, это похоже.

Конечно, важно также изменить цвет названия действий. К сожалению, я не знаю, как установить цвет действий отдельно. Но это, как вы меняете все цвета текста кнопок:

 actionController.view.tintColor = UIColor.whiteColor(); 

РЕДАКТИРОВАТЬ:

Радиус угла UIAlertController изменился с момента опубликования этого ответа! Замените это:

  alertContentView.layer.cornerRadius = 5; 

к этому:

  actionContentView.layer.cornerRadius = 15 

Я нашел хакерский способ сделать это. Сначала вам потребуется расширение, позволяющее вам искать UIVisualEffectView внутри UIAlertController :

 extension UIView { func searchVisualEffectsSubview() -> UIVisualEffectView? { if let visualEffectView = self as? UIVisualEffectView { return visualEffectView } else { for subview in subviews { if let found = subview.searchVisualEffectsSubview() { return found } } } return nil } } 

Важно : вызывать эту функцию вызывать после вызова presentViewController , потому что только после загрузки контроллера просмотра, который визуальный эффект зрения вставлен на место. Затем вы можете изменить эффект, связанный с ним, на эффект темного размытия:

 self.presentViewController(actionController, animated: true, completion: nil) if let visualEffectView = actionController.view.searchVisualEffectsSubview() { visualEffectView.effect = UIBlurEffect(style: .Dark) } 

И это конечный результат:

демонстрационный снимок

Я честно удивлен, насколько хорошо это работает! Я думаю, что это, вероятно, то, что Apple забыла добавить. Кроме того, я еще не получил приложение через одобрение с помощью этого «взлома» (это не взлом, потому что мы используем только публичные API), но я уверен, что проблем не будет.

возможно, вам нравится использовать эффект размытия в темном режиме. Вот очень простой способ получить это:

 UIVisualEffectView.appearance(whenContainedInInstancesOf: [UIAlertController.classForCoder() as! UIAppearanceContainer.Type]).effect = UIBlurEffect(style: .dark) 
 func Alert(View: ViewController, Title: String, TitleColor: UIColor, Message: String, MessageColor: UIColor, BackgroundColor: UIColor, BorderColor: UIColor, ButtonColor: UIColor) { let TitleString = NSAttributedString(string: Title, attributes: [NSFontAttributeName : UIFont.systemFontOfSize(15), NSForegroundColorAttributeName : TitleColor]) let MessageString = NSAttributedString(string: Message, attributes: [NSFontAttributeName : UIFont.systemFontOfSize(15), NSForegroundColorAttributeName : MessageColor]) let alertController = UIAlertController(title: Title, message: Message, preferredStyle: .Alert) alertController.setValue(TitleString, forKey: "attributedTitle") alertController.setValue(MessageString, forKey: "attributedMessage") let okAction = UIAlertAction(title: "OK", style: .Default) { (action) in } let cancelAction = UIAlertAction(title: "Cancel", style: .Default, handler: nil) alertController.addAction(okAction) alertController.addAction(cancelAction) let subview = alertController.view.subviews.first! as UIView let alertContentView = subview.subviews.first! as UIView alertContentView.backgroundColor = BackgroundColor alertContentView.layer.cornerRadius = 10 alertContentView.alpha = 1 alertContentView.layer.borderWidth = 1 alertContentView.layer.borderColor = BorderColor.CGColor //alertContentView.tintColor = UIColor.whiteColor() alertController.view.tintColor = ButtonColor View.presentViewController(alertController, animated: true) { // ... } } 

Swift3

Шаг в один слой сравнить с swift2

  let subview1 = alert.view.subviews.first! as UIView let subview2 = subview1.subviews.first! as UIView let view = subview2.subviews.first! as UIView subview.backgroundColor = backgroundColor view.backgroundColor = backgroundColor view.layer.cornerRadius = 10.0 // set color to UILabel font setSubviewLabelsToTextColor(textColor, view: view) // set font to alert via KVC, otherwise it'll get overwritten let titleAttributed = NSMutableAttributedString( string: alert.title!, attributes: [NSFontAttributeName:UIFont.boldSystemFont(ofSize: 17)]) alert.setValue(titleAttributed, forKey: "attributedTitle") let messageAttributed = NSMutableAttributedString( string: alert.message!, attributes: [NSFontAttributeName:UIFont.systemFont(ofSize: 13)]) alert.setValue(messageAttributed, forKey: "attributedMessage") // set the buttons to non-blue, if we have buttons if let buttonColor = buttonColor { alert.view.tintColor = buttonColor } 

Вот расширение UIAlertController которое работает как на iPad, так и на iPhone. Кнопка «Отмена» автоматически изменится с темного цвета на белый в зависимости от выбранного blurStyle:

 extension UIAlertController { private struct AssociatedKeys { static var blurStyleKey = "UIAlertController.blurStyleKey" } public var blurStyle: UIBlurEffectStyle { get { return objc_getAssociatedObject(self, &AssociatedKeys.blurStyleKey) as? UIBlurEffectStyle ?? .extraLight } set (style) { objc_setAssociatedObject(self, &AssociatedKeys.blurStyleKey, style, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) view.setNeedsLayout() view.layoutIfNeeded() } } public var cancelButtonColor: UIColor? { return blurStyle == .dark ? UIColor(red: 28.0/255.0, green: 28.0/255.0, blue: 28.0/255.0, alpha: 1.0) : nil } private var visualEffectView: UIVisualEffectView? { if let presentationController = presentationController, presentationController.responds(to: Selector(("popoverView"))), let view = presentationController.value(forKey: "popoverView") as? UIView // We're on an iPad and visual effect view is in a different place. { return view.recursiveSubviews.flatMap({$0 as? UIVisualEffectView}).first } return view.recursiveSubviews.flatMap({$0 as? UIVisualEffectView}).first } private var cancelActionView: UIView? { return view.recursiveSubviews.flatMap({$0 as? UILabel}).first(where: {$0.text == "Cancel"})?.superview?.superview } public convenience init(title: String?, message: String?, preferredStyle: UIAlertControllerStyle, blurStyle: UIBlurEffectStyle) { self.init(title: title, message: message, preferredStyle: preferredStyle) self.blurStyle = blurStyle } open override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() visualEffectView?.effect = UIBlurEffect(style: blurStyle) cancelActionView?.backgroundColor = cancelButtonColor } } 

Также необходимо следующее расширение UIView :

 extension UIView { var recursiveSubviews: [UIView] { var subviews = self.subviews.flatMap({$0}) subviews.forEach { subviews.append(contentsOf: $0.recursiveSubviews) } return subviews } } 

Пример:

 let controller = UIAlertController(title: "Dark Alert Controller", message: nil, preferredStyle: .actionSheet, blurStyle: .dark) // Setup controller actions etc... present(controller, animated: true, completion: nil) 

iPhone:

введите описание изображения здесь

IPAD:

введите описание изображения здесь

для Swift 3 Xcode 8.2.1

 let subview =(alert.view.subviews.first?.subviews.first?.subviews.first!)! as UIView subview.backgroundColor = UIColor(red: (145/255.0), green: (200/255.0), blue: (0/255.0), alpha: 1.0) alert.view.tintColor = UIColor.black 

введите описание изображения здесь ,

Для Objective-C Code может быть.

 UIAlertController * alert=[UIAlertController alertControllerWithTitle:@"Title" message:@"Message" preferredStyle:UIAlertControllerStyleAlert]; UIView *firstSubview = alert.view.subviews.firstObject; UIView *alertContentView = firstSubview.subviews.firstObject; for (UIView *subSubView in alertContentView.subviews) { subSubView.backgroundColor = [UIColor colorWithRed:255/255.0f green:255/255.0f blue:255/255.0f alpha:1.0f]; } UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action){ //Close Action }]; [alert addAction:cancelAction]; [self presentViewController:alert animated:YES completion:nil]; 

Вы можете использовать прокси-сервер внешнего вида.

 [[UIView appearanceWhenContainedIn:[UIAlertController class], nil] setBackgroundColor:[UIColor blackColor]]; 

Это кажется применимым для всех, кроме действия отмены при представлении в качестве листа действий.

  • Пользовательский шрифт, размер, цвет UIAlertController
  • Как добавить UIDatePicker в UIAlertController в iOS8?
  • Невозможно выбрать порядок кнопок в UIAlertController
  • Можно ли поворачивать UIAlertController (и Alert) в альбомной ориентации?
  • Как изменить размер шрифта кнопки UIAlertAction
  • Цвет оттенка UIAlertController по умолчанию - синий.
  • UIAlertController меняет цвет фона кнопки «Отмена» для листа действий
  • Представление контроллера представления по модулю из делегата листа действия в iOS8 - iOS10
  • UIAlertController несовместимое положение кнопок
  • как добавить кнопку в UIAlertController В IOS 9
  • Написание обработчика для UIAlertAction
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.