2013-10-16 3 views
9

다른 iOS 기기는 barStyle = UIBarStyleBlacktranslucent = YES과 매우 다른 방식으로 UINavigationBar을 렌더링합니다. 고려 :iOS 장치가 흐림 효과를 지원하는지 어떻게 알 수 있습니까?

아이폰 4, 아니 색조 : iPhone 4, no tint

아이폰 5, 더 색조 없습니다 : iPhone 5, no tint

아이폰 4, barTintColor = [UIColor colorWithWhite:0.0f alpha:0.5f] : iPhone 4, tinted

아이폰 5, barTintColor = [UIColor colorWithWhite:0.0f alpha:0.5f] : iPhone 5, tinted

iPhone 5는 원하는 ef를 생성합니다 색조가없는 덩어리지만, 4는 불투명하다. 반투명 색조를 추가하면 4가 좋게 보이지만 5는 위로 올라갑니다.

iPad 2 및 3, 이론적으로 iOS 7 흐림 효과를 지원하지 않는 모든 장치에 적용됩니다.

이러한 오래된 장치를 블랙리스트에 올리지 못하는데, 장치가 흐림을 지원하는지 여부를 감지하여 렌더링 차이점을 조건부로 해결할 수있는 방법은 무엇입니까? 아니면 색조를 전혀 사용하지 않고 모양을 정상화하는 방법이 있습니까?

+0

베타 시드 1 이후 개발자가 끊임없이 요청하고 있음에도 불구하고 공용 API는 없습니다. 사용자가 새로운 기기에서이 기능을 끌 수 있기 때문에 기기 모델을 확인하는 것은 해결책이 아닙니다. –

+0

@FilipRadelic 와우, 정말? 새 장치에서 효과를 비활성화하려면 어떻게합니까? –

+3

설정 -> 일반 -> 접근성 -> 대비 늘리기 –

답변

0

나는이 질문이 당신이 원하는 것이라고 생각합니다. 그냥 다른 장치 조건부 코드를 작성합니다 : 무엇 UIAccessibilityReduceTransparencyStatusDidChangeNotification에 대한 관찰과 함께이 UIDevice 범주에 대한

Determine device (iPhone, iPod Touch) with iPhone SDK

+0

질문에서 말했듯이 그것은 대부분의 경우 작동하는 해결 방법이지만 실제 해결책은 아닙니다. –

1

를?

@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; 
} 

구현 파일에 #include를 잊지 마세요.

관련 문제