How can I detect if an iOS device supports the blur effect?

It appears that different iOS devices render UINavigationBars with barStyle = UIBarStyleBlack and translucent = YES very differently. Consider:

iPhone 4, no tint:
iPhone 4, no tint

  • It is possible to show keyboard without using UITextField and UITextView iphone app?
  • IPA created via Xcode bot fails to run for APNS but runs if built manually via Xcode itself or built as an archive by Xcode
  • how to reload tableview of another uiviewcontroller in current viewcontroller
  • UITextView is not scrolled to top when loaded
  • Playing youtube videos on iOS
  • recursiveDescription method in Swift?
  • iPhone 5, no tint:
    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

    The iPhone 5 produces the desired effect without a tint, but the 4 is opaque. Adding a semitransparent tint makes the 4 look good, but screws up the 5.

    The same holds true for the iPad 2 and 3, and theoretically any device that does not support the iOS 7 blur effects.

    Short of blacklisting these older devices, how can I detect if a device supports the blurring so that I can conditionally work around the rendering differences? Or is there a way to normalize the appearance without using a tint at all?

    2 Solutions Collect From Internet About “How can I detect if an iOS device supports the blur effect?”

    What about this UIDevice category along with observing for 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;
    }
    

    Don’t forget to #include in your implementation file.

    I think this question is what you want to do. Just to write conditional code for different devices:

    Determine device (iPhone, iPod Touch) with iPhone SDK