How can I determine if the iPhone application is on, will it use a transparent effect instead of a blur effect?

My application on iPhone 4 running iOS 7 uses UITabBar with a custom barTintColor . As mentioned in the Apple documentation: https://developer.apple.com/library/ios/documentation/userexperience/conceptual/UIKitUICatalog/UITabBar.html

Tab lines are translucent by default on iOS 7. In addition, all tab panels have a blur system. This allows you to display content through the panel.

But this blur of the system is not displayed on the iPhone 4, and the UITabBar becomes transparent on the device, as shown below:

wHOi5m6.jpg

I believe this could be due to the weaker GPU in the iPhone 4, and therefore it should back away from transparency instead of transparency. Link: http://arstechnica.com/apple/2013/09/new-lease-on-life-or-death-sentence-ios-7-on-the-iphone-4/

A simple solution for this would be to conditionally create a UITabBar translucent for iPhone 4. But instead of putting this dependency in the type of device, I want to know if I can somehow determine if iOS will refuse transparency with a weak GPU? (Thus making the condition more appropriate)

+7
ios objective-c iphone ios7
source share
2 answers

Here are a few quick and dirty categories that detect if a device supports blurring. Hope it solves your problem.

 @interface UIToolbar (support) @property (nonatomic, readonly) BOOL supportsBlur; @end @implementation UIToolbar (support) -(BOOL) supportsBlur{ return [self _supportsBlur:self]; } -(BOOL)_supportsBlur:(UIView*) view{ if ([view isKindOfClass:NSClassFromString(@"_UIBackdropEffectView")]){ return YES; } for (UIView* subview in view.subviews){ if ([self _supportsBlur:subview]){ return YES; } } return NO; } @end // Use this category to detect if the device supports blur @interface UIDevice (support) @property (nonatomic, readonly) BOOL supportsBlur; @end @implementation UIDevice (support) -(BOOL) supportsBlur{ static BOOL supportsBlur = NO; static dispatch_once_t onceToken = 0; dispatch_once(&onceToken, ^{ UIToolbar* toolBar = [[UIToolbar alloc] init]; [toolBar layoutSubviews]; supportsBlur = toolBar.supportsBlur; }); return supportsBlur; } @end 
+6
source share

As far as I know, there is no way to β€œcompare” the GPU to see if it is too weak to show a translucent effect. Even if you find this way, it will be redundant, and not just checking if the current device is iPhone 4. The fact is that you can not check the borders or something like that, because you still want to show the effect on the iPhone 4S, so you cannot rule out anything that is not iPhone 5. I usually use this simple class to identify a user device.

 #import "UIDeviceHardware.h" #include <sys/types.h> #include <sys/sysctl.h> @implementation UIDeviceHardware - (NSString *) platform{ size_t size; sysctlbyname("hw.machine", NULL, &size, NULL, 0); char *machine = malloc(size); sysctlbyname("hw.machine", machine, &size, NULL, 0); NSString *platform = [NSString stringWithUTF8String:machine]; free(machine); return platform; } - (NSString *) platformString{ NSString *platform = [self platform]; if ([platform isEqualToString:@"iPhone1,1"]) return @"iPhone 1G"; if ([platform isEqualToString:@"iPhone1,2"]) return @"iPhone 3G"; if ([platform isEqualToString:@"iPhone2,1"]) return @"iPhone 3GS"; if ([platform isEqualToString:@"iPhone3,1"]) return @"iPhone 4"; if ([platform isEqualToString:@"iPhone3,3"]) return @"Verizon iPhone 4"; if ([platform isEqualToString:@"iPhone4,1"]) return @"iPhone 4S"; if ([platform isEqualToString:@"iPhone5,1"]) return @"iPhone 5 (GSM)"; if ([platform isEqualToString:@"iPhone5,2"]) return @"iPhone 5 (GSM+CDMA)"; if ([platform isEqualToString:@"iPhone5,3"]) return @"iPhone 5c (GSM)"; if ([platform isEqualToString:@"iPhone5,4"]) return @"iPhone 5c (Global)"; if ([platform isEqualToString:@"iPhone6,1"]) return @"iPhone 5s (GSM)"; if ([platform isEqualToString:@"iPhone6,2"]) return @"iPhone 5s (Global)"; if ([platform isEqualToString:@"iPod1,1"]) return @"iPod Touch 1G"; if ([platform isEqualToString:@"iPod2,1"]) return @"iPod Touch 2G"; if ([platform isEqualToString:@"iPod3,1"]) return @"iPod Touch 3G"; if ([platform isEqualToString:@"iPod4,1"]) return @"iPod Touch 4G"; if ([platform isEqualToString:@"iPod5,1"]) return @"iPod Touch 5G"; if ([platform isEqualToString:@"iPad1,1"]) return @"iPad"; if ([platform isEqualToString:@"iPad2,1"]) return @"iPad 2 (WiFi)"; if ([platform isEqualToString:@"iPad2,2"]) return @"iPad 2 (GSM)"; if ([platform isEqualToString:@"iPad2,3"]) return @"iPad 2 (CDMA)"; if ([platform isEqualToString:@"iPad2,4"]) return @"iPad 2 (WiFi)"; if ([platform isEqualToString:@"iPad2,5"]) return @"iPad Mini (WiFi)"; if ([platform isEqualToString:@"iPad2,6"]) return @"iPad Mini (GSM)"; if ([platform isEqualToString:@"iPad2,7"]) return @"iPad Mini (GSM+CDMA)"; if ([platform isEqualToString:@"iPad3,1"]) return @"iPad 3 (WiFi)"; if ([platform isEqualToString:@"iPad3,2"]) return @"iPad 3 (GSM+CDMA)"; if ([platform isEqualToString:@"iPad3,3"]) return @"iPad 3 (GSM)"; if ([platform isEqualToString:@"iPad3,4"]) return @"iPad 4 (WiFi)"; if ([platform isEqualToString:@"iPad3,5"]) return @"iPad 4 (GSM)"; if ([platform isEqualToString:@"iPad3,6"]) return @"iPad 4 (GSM+CDMA)"; if ([platform isEqualToString:@"iPad4,1"]) return @"iPad Air (WiFi)"; if ([platform isEqualToString:@"iPad4,2"]) return @"iPad Air (GSM)"; if ([platform isEqualToString:@"iPad4,4"]) return @"iPad Mini Retina (WiFi)"; if ([platform isEqualToString:@"iPad4,5"]) return @"iPad Mini Retina (GSM)"; if ([platform isEqualToString:@"i386"]) return @"Simulator"; if ([platform isEqualToString:@"x86_64"]) return @"Simulator"; return platform; } @end 
+1
source share

All Articles