2

iOSデバイスでのRetinaディスプレイの検出に問題があります。私はさまざまな人々によって推奨された次のコードを使用しています:

BOOL isRetina()
{
    UIScreen* s = [UIScreen mainScreen];
    if ([s respondsToSelector:@selector(displayLinkWithTarget:selector:)] &&
        [s respondsToSelector:@selector(scale)])
    {
        CGFloat scale = [s scale];
        return scale == 2.0;
    }

    return NO;
}

問題は、展開ターゲットのiOS 4以降では正常にコンパイルされることですが、iOS3.2でコンパイルすると、「scale =[sscale]」行で「Incompatibletypesininitialization」エラーが発生します。フロートにIDを割り当てます。それについては何も見つかりませんでした。他の誰もがこのアプローチを使用しているように見えるので、私はここで本当に明白な何かを見逃しているに違いありませんか?ちなみに、ベースSDKのバージョンは4.3で、XCode4が含まれています。

BaseSDK/デプロイメントターゲットの設定は次のとおりです。 SDK設定

更新:私はそれを解決しました。基本的に、問題はXCodeの問題でした。他の問題を修正するには、XCodeをアンインストールして再インストールする必要がありました。その後、動作はなくなりました。

4

2 に答える 2

1

これは私が使用するコードで、3.1 までさかのぼって動作します (それ以前はテストしていません)。

BOOL isRetina;
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] && [[UIScreen mainScreen] scale] == 2){
    isRetina = YES;
} else {
    isRetina = NO;
}

@DarkDustが指摘したように、問題は実際にはあなたのコードではありません(ただし、上記はあなたにとってより簡単なはずですが)、3.2用にコンパイルしようとしており、実際には展開ターゲットを3.2に設定し、引き続き最新のSDK。

scale違いは、古い SDK 用にコンパイルすると、実際にはそのコード行に到達しないにもかかわらず、そのメソッド ( ) を呼び出すことができないことがわかっているため、ビルドに失敗することです。ただし、配置ターゲットを正しく設定した場合は、3.2 でコードを使用できます。scaleメソッドが存在しないことを確認したため、メソッドが存在しない場所でメソッドが呼び出されることは決してないことがわかっているため、心配する必要はありません。

于 2011-04-14T14:11:39.780 に答える
1

iOS 3.2 ではシンボルが定義されていないため、iOS SDK 3.2 でコンパイルすると、コンパイラはデフォルトでシンボル-[UIScreen scale]が返されると想定します。idしたがって、警告。

コンパイルする SDK とデプロイ ターゲットの違いを理解することは非常に重要です。通常、最新の SDK に対してコンパイルする必要がありますが、サポートする最小の iOS バージョンのデプロイ ターゲットを設定します。

于 2011-04-14T14:06:36.903 に答える