2014-02-06 49 views
7

我在iPhone 4上運行iOS 7的應用程序使用帶有自定義barTintColor的UITabBar。如Apple文檔中所述:https://developer.apple.com/library/ios/documentation/userexperience/conceptual/UIKitUICatalog/UITabBar.html如何檢測iPhone是否開啓我的應用程序,是否將使用簡單的透明效果而不是模糊效果?

標籤欄在iOS 7中默認爲半透明。此外,系統模糊應用於所有標籤欄。這可以讓您的內容通過酒吧底部顯示。

但這個系統模糊不上iPhone 4可見,並且UITabBar那張設備上透明,如下圖所示:

相信,這可能是因爲較弱的是發生GPU在iPhone 4中,因此它必須回落到透明而不是半透明。參考:http://arstechnica.com/apple/2013/09/new-lease-on-life-or-death-sentence-ios-7-on-the-iphone-4/

一個簡單的解決這個可以有條件地使UITabBartranslucent的iPhone 4,但不是把這個扶養設備類型,我想知道如果我能以某種方式檢測如果iOS打算在GPU弱時會回落到透明度? (因此使條件更合適)

+0

恐怕沒有辦法找到是否支持半透明,因爲這是由GPU在運行時確定的。最好的方法是檢查設備版本。 –

回答

6

這裏有一些快速和骯髒的類別,檢測設備是否支持模糊。希望它解決您的問題

@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 
+0

您確定這是否適合?我相信即使設備不支持模糊,工具欄也會將'_UIBackdropView'作爲子視圖。 –

+0

已更新代碼以提供可讓您詢問設備是否支持bluring的類別 – datinc

+0

對於工具欄,iPhone 4上的子視圖是_UIToolbarBackground,_UIBackdropView,UIView和UIImageVie。對於iPhone 5:_UIToolbarBackground,_UIBackdropView,_UIBackdropEffectView。 _UIBackdropEffectView是我們正在尋找的 – datinc

1

據我所知,沒有辦法「測試」GPU以便知道它是否太弱而不能顯示半透明效果。即使你會找到這樣一種方式,這將是一種矯枉過正,而不是僅僅檢查當前設備是否爲iPhone 4。問題是你無法檢查邊界或類似的東西,因爲你仍然想要顯示效果在iPhone 4S上,所以你不能排除任何不是iPhone 5的東西。 通常我使用這個簡單的類來識別用戶設備。

#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

這肯定是做到這一點的一種方法(正如我在問題中提到的那樣),但我想要的是操作系統而不是設備的依賴性。爲了清楚一點,它更有意義,因爲我的條件不是「如果設備是iPhone 4使視圖不透明」,但它是「如果iOS將使透明而不是半透明,則使視圖不透明」。 我期待的是操作系統在這種情況下設置的一些宏。我希望蘋果公司內部也做這樣的事情,否則整個系統會變得脆弱。 –

+1

建議的代碼歸屬地址:https://github.com/erica/uidevice-extension/ https://github.com/erica/uidevice-extension/blob/master/UIDevice-Hardware.m –

相關問題