2017-06-17 3 views
0

Ich versuche, einen UIAlertController mit dem Aktionsblattstil zu erstellen, aber ich möchte die Hintergrundfarbe in eine graue Farbe ändern. Ich konnte eine Möglichkeit finden, die Hintergrundfarbe des UIAlertControllers zu ändern, aber nicht die Schaltfläche Abbrechen. Die Schaltfläche Abbrechen, die separat ist, bleibt weiß.UIAlertController Hintergrundfarbe der Schaltfläche "Abbrechen" für Aktionsblatt ändern

Dies ist der Code, den ich jetzt haben:

UIAlertController *alert = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet]; 

[alert addAction:[UIAlertAction actionWithTitle:@"Option 1" style:UIAlertActionStyleDefault handler:nil]]; 
[alert addAction:[UIAlertAction actionWithTitle:@"Option 2" style:UIAlertActionStyleDefault handler:nil]]; 
[alert addAction:[UIAlertAction actionWithTitle:@"Option 3" style:UIAlertActionStyleDefault handler:nil]]; 
[alert addAction:[UIAlertAction actionWithTitle:@"Delete" style:UIAlertActionStyleDestructive handler:nil]]; 

[alert addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil]]; 

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

for (UIView *subSubView in alertContentView.subviews) { 
    subSubView.backgroundColor = [UIColor darkGrayColor]; // Here you change background 
} 

alert.view.tintColor = [UIColor whiteColor]; 

[self.controller presentViewController:alert animated:YES completion:nil]; 

Und das gibt mir folgendes Ergebnis: Link

ich besucht habe How to change the background color of the UIAlertController? aber keine der Lösungen haben eine eigene Farbe für die Hintergrund der Schaltfläche Abbrechen.

Jede Hilfe wäre willkommen!

+0

Möchten Sie die Hintergrundfarbe für Abbrechen-Schaltfläche ändern? – user3182143

+0

Siehe meine Codierung Ich änderte die Farbe der Abbrechen-Schaltfläche in DarkGray-Farbe. – user3182143

+0

Ich möchte die Schaltfläche Abbrechen, um dunkelgraue Hintergrundfarbe und weißen Text zu haben. Ihr Code scheint das nicht zu tun, tut aber das Gegenteil: Die Hintergrundfarbe Ihrer Abbrechen-Schaltfläche ist weiß und Ihre Textfarbe ist grau. – Pibomb

Antwort

0

Ich habe jetzt die Lösung. Ich habe ein Beispielprojekt erstellt und für deine Frage ausgearbeitet und ich habe es bekommen.

ViewController.h

#import <UIKit/UIKit.h> 
@interface ViewController : UIViewController 
@end 

ViewController.m

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    UIAlertController *alert = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet]; 

    [alert addAction:[UIAlertAction actionWithTitle:@"Option 1" style:UIAlertActionStyleDefault handler:nil]]; 
    [alert addAction:[UIAlertAction actionWithTitle:@"Option 2" style:UIAlertActionStyleDefault handler:nil]]; 
    [alert addAction:[UIAlertAction actionWithTitle:@"Option 3" style:UIAlertActionStyleDefault handler:nil]]; 
    [alert addAction:[UIAlertAction actionWithTitle:@"Delete" style:UIAlertActionStyleDestructive handler:nil]]; 

    [alert addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil]]; 

    UIView *subView = alert.view.subviews.lastObject; //firstObject 
    UIView *alertContentView = subView.subviews.lastObject; //firstObject 
    [alertContentView setBackgroundColor:[UIColor darkGrayColor]]; 
    alertContentView.layer.cornerRadius = 5; 
    [self presentViewController:alert animated:YES completion:nil]; 
    alert.view.tintColor = [UIColor darkGrayColor]; 
} 


- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 


@end 

siehe Ausgabe

enter image description here

+1

Ich glaube nicht, dass Sie meine Frage richtig verstanden haben. Die Hintergrundfarbe Ihrer Abbrechen-Schaltfläche ist immer noch weiß und Ihr Text ist jetzt grau. Ich brauche das Gegenteil – Pibomb

4

Wenn Sie eine separate Taste abbrechen möchten (UIAlertActionStyleCancel) Sie können nicht Ändern Sie die Hintergrundfarbe der Abbrechen-Schaltfläche. Wenn es Ihre Priorität ist, müssen Sie Ihre eigene benutzerdefinierte Ansicht erstellen. Oder Sie können einfach eine Standardaktion mit dem Titel "Abbrechen" hinzufügen.

[alert addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault handler:nil]]

(Aber es wird nicht eine separate Taste geben).

Ich habe die Ansichtshierarchie überprüft und gefunden. enter image description here

0

Es gibt eine sehr sehr schmutzige Lösung, aber es funktioniert. Wir werden UIAppearance für diesen Zweck verwenden.

Zuerst müssen wir eine spezielle private Erweiterung für UIView vorbereiten, um die Hintergrundfarbe der Subviews ändern zu können.

fileprivate extension UIView { 
    private struct AssociatedKey { 
     static var subviewsBackgroundColor = "subviewsBackgroundColor" 
    } 

    @objc dynamic var subviewsBackgroundColor: UIColor? { 
     get { 
      return objc_getAssociatedObject(self, &AssociatedKey.subviewsBackgroundColor) as? UIColor 
     } 

     set { 
      objc_setAssociatedObject(self, 
            &AssociatedKey.subviewsBackgroundColor, 
            newValue, 
            .OBJC_ASSOCIATION_RETAIN_NONATOMIC) 
      subviews.forEach { $0.backgroundColor = newValue } 
     } 
    } 
} 

Jedes Mal, wenn wir subiewsBackgroundColor Wert UIView gesetzt wird es Subviews iterieren und eine neue Hintergrundfarbe für jeden Satz.

Wie Sie in der Antwort unten sehen können gibt es eine spezielle UIView _UIAlertControlleriOSActionSheetCancelBackgroundView in UIAlertController Hierarchie genannt, die eine Subview mit weißer Farbe enthält (für die Löschtaste)

Lasst uns versuchen, es ist Aussehen zu erhalten und nutzen Sie unser Eigenschaft, um die Unteransichtsfarbe zu ändern. Ich denke, es ist eine Art private API.

if let cancelBackgroundViewType = NSClassFromString("_UIAlertControlleriOSActionSheetCancelBackgroundView") as? UIView.Type { 
    cancelBackgroundViewType.appearance().subviewsBackgroundColor = .red 
} 

Platz dieser Code in der AppDelegate des didFinishLaunching oder eine dedizierte Klasse. Das ist es. Jetzt können Sie den Abbrechen-Button auf einem roten Hintergrund sehen. Getestet auf iOS 11.

Verwandte Themen