2012-03-26 24 views
2

ビューのdrawRect関数で描画されるインタラクティブな図面を含むカスタムUIViewがあります。 iPadの場合、描画サイズは1024 x 768です。iPhoneの場合、CGContextScaleCTMを使用してiPhone用の図面を縮小します。私の図面で適切なアスペクト比を維持するために、ビューを480 x 360に縮小し、ビューのy値を-20に設定します(Viewの上と下の20ピクセルを効果的にトリミングします)。今はすべてが正しいように見えますが、私のビューのインタラクティブな部分が機能するためには、タッチ座標をiPhoneからiPad座標に変換する必要があります。私はUIViewの320高くするとyの値を変換するためのiPhoneの画面サイズからiPadの画面サイズに座標を変換

point.y *=768/320 

を使用している場合は場所が(私の図面が歪んでいる)私はハード私は、これは動作するはずです知っているが、私そうでポイントをコーディングするいくつかのテストを行ってきた正しいです作物と一緒に仕事をするのが難しい時です。これまで私が持っていたものは次のとおりです。

CGPoint point = [[touches anyObject] locationInView:self.view]; 
[self endTouch:&point]; 
NSLog(@"true point: %@",NSStringFromCGPoint(point)); 
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { 
point.x *= 1024/480; 
point.y *= 768/360; 
NSLog(@"corrected point: %@",NSStringFromCGPoint(point)); 
} 

誰でもこの変換を手伝ってくれますか?ありがとう!

答えて

3

1024/480および768/360は整数除算を行います。両方の操作の結果は2ですが、実際には2.133333が必要です。以下に、あなたのコード内の該当する行を置き換えます

point.x *= 1024.0/480.0; 
point.y *= 768.0/360.0; 

これは、あなたが探している値を返し、それに応じてポイントのxy値をスケーリングします。

これらのリテラルを#defineマクロに置き換えると、読みやすくなります。あなたのコードの上部には、次のように置く。その後、

#define SCALING_FACTOR_X (1024.0/480.0) 
#define SCALING_FACTOR_Y (768.0/360.0) 

とそれを使用するようにコードを変更します。

point.x *= SCALING_FACTOR_X; 
point.y *= SCALING_FACTOR_Y; 

その方法、それはあなたが実際にやっていることに、より明確になります。

+0

ありがとう!私が以前に得ていた奇妙なことを説明しています。 #defineマクロのヒントもありがとう。それはCなのか、それとも客観的なものなのでしょうか?私はこれらをネットの周りからのコードで使用しているのを見ましたが、私が学び始めた目的のCの本の中でそれらを見いだすことはありませんでした。 – Frank

+0

@jonmorgan逆は何ですか? iPad座標をiPhone座標に変換する必要があります。任意のヒント? – Corey

関連する問題