2013-10-16 13 views
9

Sembra che diversi dispositivi iOS rendano UINavigationBar s con barStyle = UIBarStyleBlack e translucent = YES in modo molto diverso. Considerate:Come posso rilevare se un dispositivo iOS supporta l'effetto sfocatura?

iPhone 4, senza tinta: iPhone 4, no tint

iPhone 5, nessuna tinta: iPhone 5, no tint

iPhone 4, barTintColor = [UIColor colorWithWhite:0.0f alpha:0.5f]: iPhone 4, tinted

iPhone 5, barTintColor = [UIColor colorWithWhite:0.0f alpha:0.5f]: iPhone 5, tinted

L'iPhone 5 produce l'ef desiderato fect senza tinta, ma il 4 è opaco. L'aggiunta di una tinta semitrasparente fa sembrare il 4 buono, ma alza il 5.

Lo stesso vale per l'iPad 2 e 3, e in teoria qualsiasi dispositivo che non supporta gli effetti di sfocatura di iOS 7.

A parte la blacklist di questi vecchi dispositivi, come posso rilevare se un dispositivo supporta la sfocatura in modo da poter condizionare in modo condizionato le differenze di rendering? O c'è un modo per normalizzare l'aspetto senza usare una tinta?

+0

Non esiste alcuna API pubblica, nonostante sia richiesta costantemente dagli sviluppatori dal seme beta 1. Il controllo del modello di dispositivo non è una soluzione perché gli utenti possono disattivarlo sui dispositivi più recenti. –

+0

@FilipRadelic Whoa, davvero? Come posso disattivare l'effetto su un dispositivo più recente? –

+3

Impostazioni -> Generale -> Accessibilità -> Aumenta il contrasto –

risposta

0

Penso che questa domanda sia ciò che vuoi fare. Basta scrivere il codice condizionale per i vari dispositivi:

Determine device (iPhone, iPod Touch) with iPhone SDK

+0

Come ho detto nella domanda, questa è una soluzione che funziona la maggior parte del tempo, ma non è una soluzione reale. –

1

Che dire di questa categoria UIDevice insieme con l'osservazione per UIAccessibilityReduceTransparencyStatusDidChangeNotification?

@interface UIDevice (Additions) 

@property (readonly) NSString *platform; 
@property (readonly) BOOL canBlur; 

@end 


@implementation UIDevice (Additions) 

- (NSString *)platform { 
    int mib[] = { CTL_HW, HW_MACHINE }; 
    size_t len = 0; 
    sysctl(mib, 2, NULL, &len, NULL, 0); 
    char *machine = malloc(len); 
    sysctl(mib, 2, machine, &len, NULL, 0); 
    NSString *platform = [NSString stringWithCString:machine encoding:NSASCIIStringEncoding]; 
    free(machine); 

    return platform; 
} 

- (BOOL)canBlur { 
    if(NSStringFromClass([UIVisualEffectView class]) && UIDevice.currentDevice.systemVersion.floatValue >= 8.0 && !UIAccessibilityIsReduceTransparencyEnabled()) { 
     NSString *platform = self.platform; 
     CGFloat deviceVersion = [[[platform stringByReplacingOccurrencesOfString:@"[^0-9,.]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, platform.length)] stringByReplacingOccurrencesOfString:@"," withString:@"."] floatValue]; 

     if([platform isEqualToString:@"i386"] || [platform isEqualToString:@"x86_64"]) { 
      return YES; 
     } else if([platform rangeOfString:@"iPhone"].location != NSNotFound) { 
      return (deviceVersion >= 4.1); 
     } else if([platform rangeOfString:@"iPod"].location != NSNotFound) { 
      return (deviceVersion >= 5.1); 
     } else if([platform rangeOfString:@"iPad"].location != NSNotFound) { 
      return (deviceVersion >= 3.4); 
     } 
    } 

    return NO; 
} 

Non dimenticare di includere #include nel file di implementazione.

Problemi correlati