0

私は通常、次のようにビューコントローラーで静的な const 形式で四角形と色を宣言します。(これらはコンパイル時です)

#import "something.h"

static const CGRect someRect = { w, x, y, z };
static const uint8_t someColor[] = { 255, 0 , 0}

@implementation

// other methods

@end

この方法は、デバイス固有のシナリオに関してはうまく機能しません。たとえば、iPhone5 および iPod Touch 第 5 世代の rect を少し高くしたい場合、コンパイル時にこれを決定する方法はありません。(iPhone 5 の場合は、armv7s アーキテクチャのビルド設定でプリプロセッサ マクロを追加できる可能性があります -> 下の画像)、iTouch の場合、アーキテクチャは armv7 であり、これは iPhone4S とも衝突します。将来的に同じアーキテクチャで画面サイズを変更する場合、このアプローチは文字通りねじ込まれます。

プリプロセッサ マクロ

私の質問は、回避策/修正またはこれに代わるものです。? また、心に留めていることをいくつかリストアップしますが、このようなことを行うためのあなたの意見とベストプラクティスを知りたいです.

1 - 古い 320x480 デバイスの場合と同じように実行し、実行時に割り当てられた正しい画面サイズを取得するため、UI 要素を拡大または拡大します ( autoresizingmask )。

2 - +initialize() メソッドを使用します。これはランタイムになりますが (元のアプローチのコンパイル時間とは対照的)、画面サイズとデバイスの種類を見つけるためのすべての高度なメソッドにアクセスできます。

上記のすべての方法はばかげているため、または他の方法です。

4

2 に答える 2

2

コンパイル時にデバイスを検出しようとしないでください。それは不可能です。あなたが言ったように、Apple は iPhone 5/iPod 5 とは異なるハードウェア特性を持つ armv7s で動作する将来の iOS デバイスをリリースする可能性があるため、コードがどのようなデバイスで実行されるかを事前に知ることはできません。

代わりに、実行時にデバイス タイプを検出し、適切なアクションを実行する必要があります。画面サイズなどの特定の機能は実行時までわからないため、明らかにコンパイル時の定数にすることはできません。そのため、それに応じてコードを再構築する必要があります。

理想的には、特定の *device タイプを検出してそれに基づいて行動するべきではありません。代わりに、どの機能を持っている/必要としているかを判断し、それに基づいて行動してください。たとえば、複数のデバイスの異なる画面サイズをハードコーディングする代わりに、実行時に画面サイズを取得します。カメラがあるかどうかを検出し、それに基づいて写真を撮るかどうかなどを決定します。デバイスが OpenGL ES v2.0 をサポートしているかどうかを検出し、それに基づいてレンダリング コードを変更します。等々。

ただし、特定のデバイス モデルを本当に検出する必要がある場合は、この質問にその方法を示すいくつかの回答があります。

于 2013-08-09T04:23:56.290 に答える