C'è un problema con l'impostazione del colore di tinta sulla vista dopo aver presentato; anche se lo si fa nel blocco di completamento di presentViewController: animato: completamento:, provoca un effetto sfarfallio sul colore dei titoli dei pulsanti. Questo è sciatto, poco professionale e completamente inaccettabile.
L'unico modo sicuro per risolvere questo problema e farlo ovunque, è aggiungendo una categoria a UIAlertController e facendo girare la vistaWillAppear.
L'intestazione:
//
// UIAlertController+iOS9TintFix.h
//
// Created by Flor, Daniel J on 11/2/15.
//
#import <UIKit/UIKit.h>
@interface UIAlertController (iOS9TintFix)
+ (void)tintFix;
- (void)swizzledViewWillAppear:(BOOL)animated;
@end
L'implementazione:
//
// UIAlertController+iOS9TintFix.m
//
// Created by Flor, Daniel J on 11/2/15.
//
#import "UIAlertController+iOS9TintFix.h"
#import <objc/runtime.h>
@implementation UIAlertController (iOS9TintFix)
+ (void)tintFix {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Method method = class_getInstanceMethod(self, @selector(viewWillAppear:));
Method swizzle = class_getInstanceMethod(self, @selector(swizzledViewWillAppear:));
method_exchangeImplementations(method, swizzle);});
}
- (void)swizzledViewWillAppear:(BOOL)animated {
[self swizzledViewWillAppear:animated];
for (UIView *view in self.view.subviews) {
if (view.tintColor == self.view.tintColor) {
//only do those that match the main view, so we don't strip the red-tint from destructive buttons.
self.view.tintColor = [UIColor colorWithRed:0.0 green:122.0/255.0 blue:1.0 alpha:1.0];
[view setNeedsDisplay];
}
}
}
@end
Aggiungere a.PCH (intestazione precompilata) al progetto e comprendono la categoria:
#import "UIAlertController+iOS9TintFix.h"
Assicurarsi si registra il PCH nel progetto correttamente, e comprenderà i metodi di categoria in ogni classe che utilizza l'UIAlertController.
Poi, nel metodo di vostra applicazione delegati didFinishLaunchingWithOptions, importare la categoria e chiamare
[UIAlertController tintFix];
e sarà automaticamente propagarsi ad ogni singola istanza di UIAlertController all'interno della vostra app, se lanciato dal codice o di chiunque altro.
Questa soluzione funziona sia per iOS 8.X che per iOS 9.X e manca lo sfarfallio del cambio di tonalità dopo la presentazione.
Oggetti di scena pazzi a Brandon sopra per iniziare questo viaggio, purtroppo la mia reputazione non è stata sufficiente per commentare il suo post, altrimenti l'avrei lasciato lì!
Ho provato ma non lavoro per me. – RayChen
Assicurati di non avere altre parti del tuo codice che possono sovrascrivere il 'tintColor' (ad es. Impostazioni globali tramite proxy di aspetto, ecc.). – dbart
grazie, funziona dopo la rimozione della finestra chiave tintColor – RayChen