It appears that different iOS devices render UINavigationBar
s with barStyle = UIBarStyleBlack
and translucent = YES
very differently. Consider:
iPhone 4, no tint:
iPhone 5, no tint:
iPhone 4, barTintColor = [UIColor colorWithWhite:0.0f alpha:0.5f]
:
iPhone 5, barTintColor = [UIColor colorWithWhite:0.0f alpha:0.5f]
:
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?
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With