Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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?

like image 944
Ian Henry Avatar asked Oct 16 '13 19:10

Ian Henry


People also ask

How do you blur out text on iPhone?

If you want to mask or blur texts from your iPhone screenshot, you would need to download an iOS photo blurring app. The Blue Photo Editor is one of the best apps to blur out words from your images on your iPhone.


1 Answers

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.

like image 165
Kukosk Avatar answered Nov 14 '22 20:11

Kukosk