9

さまざまな iOS デバイスが と を使用して をレンダリングする方法はUINavigationBar大きくbarStyle = UIBarStyleBlack異なるようtranslucent = YESです。検討:

iPhone 4、色合いなし: iPhone 4、色合いなし

iPhone 5、色合いなし: iPhone 5、色合いなし

iPhone 4 barTintColor = [UIColor colorWithWhite:0.0f alpha:0.5f]: iPhone 4、着色

iPhone 5 barTintColor = [UIColor colorWithWhite:0.0f alpha:0.5f]: iPhone 5、着色

iPhone 5 は色合いなしで望ましい効果を生み出しますが、4 は不透明です。半透明の色合いを追加すると、4 は見栄えがよくなりますが、5 は台無しになります。

同じことが iPad 2 および 3 にも当てはまり、理論的には iOS 7 のぼかし効果をサポートしていないデバイスにも当てはまります。

これらの古いデバイスをブラックリストに登録する以外に、レンダリングの違いを条件付きで回避できるように、デバイスがぼかしをサポートしているかどうかを検出するにはどうすればよいですか? または、色合いをまったく使用せずに外観を正規化する方法はありますか?

4

2 に答える 2

1

UIAccessibilityReduceTransparencyStatusDidChangeNotification を観察するとともに、この UIDevice カテゴリはどうですか?

@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 することを忘れないでください。

于 2014-11-22T04:01:47.443 に答える
0

この質問はあなたがやりたいことだと思います。さまざまなデバイスの条件付きコードを記述するだけです。

iPhone SDKでデバイス(iPhone、iPod Touch)を判別

于 2013-11-12T03:31:19.163 に答える