0

私は2つUIImageViewのを保持するView Controllerに取り組んでいます。下の画像ビューには、写真 (ユーザーが撮影または選択したもの) が表示されます。2 番目のイメージ ビューはこの上に配置され、画面全体を占有します。

2 番目のイメージ ビューにはポインターが含まれています (下の例では緑色の点)。画面上に配置できる可動ビューとして使用されます。その使用は、その背後にある写真の位置/ポイントをマークすることです。

ポートレートでは、これは正常に機能し、下の画像ビューは画像 = アスペクト フィルに設定されます。したがって、撮影した写真は画面全体を占めます。

横向きでは、これも機能しません。私はもう少しうまく説明することができます

下のひどく描かれた画像

ここに画像の説明を入力

例として、ユーザーがポートレート ビュー (緑色の点で表示) 上のポイントを選択した場合、おおよその位置は 220,380 です。

ただし、同じ位置が横向きの場合、後ろの写真では同じ位置にはなりません。

ポイントは、280,300 のように変換されます。

問題は... VC が横向きの場合、同じポイントを計算するために (下の画像ビュー内から) 画像の高さと幅をどのように決定すればよいですか?

または、これを達成するための別の方法/アプローチはありますか?

-------編集 ---------- この機能だけを含むテストアプリを作成しました。上記と同じ設定をしています。ビューにログを追加し、向きを横向きに変更しました。私が使用しているログは次のとおりです。

NSLog(@"bottom image view width: %f",self.photoImageView.frame.size.width);
NSLog(@"bottom image view height: %f",self.photoImageView.frame.size.height);
NSLog(@"bottom image view frame bounds X: %f",self.photoImageView.frame.origin.x);
NSLog(@"bottom image view frame bounds Y: %f",self.photoImageView.frame.origin.y);
NSLog(@"bottom image view bounds X: %f",self.photoImageView.bounds.origin.x);
NSLog(@"bottom image view bounds Y: %f",self.photoImageView.bounds.origin.y);
NSLog(@"---------BOTTOM IMAGE VIEW IMAGE DETAILS---------");
NSLog(@"bottom image view image width: %f",self.photoImageView.image.size.width);
NSLog(@"bototm image view image height: %f",self.photoImageView.image.size.height);
NSLog(@"bottom image view image frame bounds X: %f",self.photoImageView.image.accessibilityFrame.origin.x);
NSLog(@"buttom image view image frame bounds Y: %f",self.photoImageView.image.accessibilityFrame.origin.y);

結果は次のとおりです。

2013-07-30 14:58:23.013 SelectPhotoViewTest[3414:c07] ---------VIEW DETAILS---------
2013-07-30 14:58:23.014 SelectPhotoViewTest[3414:c07] ---------BOTTOM IMAGE VIEW DETAILS---------
2013-07-30 14:58:23.015 SelectPhotoViewTest[3414:c07] bottom image view width: 480.000000
2013-07-30 14:58:23.016 SelectPhotoViewTest[3414:c07] bottom image view height: 268.000000
2013-07-30 14:58:23.016 SelectPhotoViewTest[3414:c07] bottom image view frame bounds X: 0.000000
2013-07-30 14:58:23.017 SelectPhotoViewTest[3414:c07] bottom image view frame bounds Y: 0.000000
2013-07-30 14:58:23.018 SelectPhotoViewTest[3414:c07] bottom image view bounds X: 0.000000
2013-07-30 14:58:23.018 SelectPhotoViewTest[3414:c07] bottom image view bounds Y: 0.000000
2013-07-30 14:58:23.019 SelectPhotoViewTest[3414:c07] ---------BOTTOM IMAGE VIEW IMAGE DETAILS---------
2013-07-30 14:58:23.019 SelectPhotoViewTest[3414:c07] bottom image view image width: 258.000000
2013-07-30 14:58:23.019 SelectPhotoViewTest[3414:c07] bototm image view image height: 480.000000
2013-07-30 14:58:23.020 SelectPhotoViewTest[3414:c07] bottom image view image frame bounds X: 0.000000
2013-07-30 14:58:23.021 SelectPhotoViewTest[3414:c07] buttom image view image frame bounds Y: 0.000000

これらの結果から、中心点が下の画像座標のどこにあるかを判断するにはどうすればよいですか?

4

1 に答える 1

0

実際には、両方の方向でポイントを画像の座標系に変換する必要があります。あなたが示した例では、画像の縦横比が画面と同じであるため、縦向きでのみ機能します。正方形の画像がある場合、ポイントは画像と 1:1 の関係を持たず、画像の外に簡単に配置できます。

頭の中で目標を達成するための 2 つの方法を考えることができます。

1) 下部のイメージビューを画面全体に表示して縦横比を埋める代わりに、手動でサイズを変更して、画像に応じて画面の幅全体または高さのいずれかを占めるようにします。つまり、1000x1000 の画像がある場合、画像ビューを縦向き (iphone3) の場合は 320x320、横向きの場合は 300x300 にする必要があります。次に、2 番目の画像を最初の画像のサブビューにします。その位置は、下の画像の座標系に相対的になります。

2) 簡単な計算を使用して、画面上の点を画像の座標系に変換します。下の画像ビューのサイズと縦横比を知っており、画像についても同じことを知っています。

画像が 640x920 だとしましょう。横向きでは、下の画像ビューは 480x300 になります。

1)画像を画像ビュー(209x300)に表示されるサイズにスケーリングします

2) 画像は中央に配置されるため、左から 136 ポイントあたりから開始されます

3) したがって、画面上の (280, 300) のポイントは、小さいイメージに対して (144, 280 [ステータス バーの -20 ポイント]) に変換され、フル イメージの座標では (441, 859) に変換されます。システム。

これがあなたを正しい方向に向けてくれることを願っています。

編集:

わかりました、サンプルログの作業:

[ところで、次のように CGRECT をより簡単に印刷できます: NSLog(@"%@", NSStringFromCGRect(self.photoImageView.frame))]

1) 画像ビューに収まるように画像の寸法をスケーリングします。

ratio = photoImageView.frame.size.height / photoImageView.image.size.height;
height = photoImageView.image.size.height * ratio;
width = photoImageView.image.size.width * ratio;

2)画像ビュー内の画像のフレームを計算します

x = (photoImageView.frame.size.width - width) / 2;
y = 0;
frame = CGRectMake(x, y, width, height);

3) [touch locationInView:photoImageView] を使用してロケーション ポイントを取得すると仮定すると、タッチが画像フレーム内にあるかどうかを確認できます。

CGRectContainsPoint(frame, location)

編集 - 使用される実際のコードを含めます - 上記の画像ビューの向きの処理とは少し異なります。

if (self.photoImageView.frame.size.height < self.photoImageView.frame.size.width ) {
    // This is device and image view is landscape
    if (self.pushedPhoto.size.height < self.pushedPhoto.size.width) {
        // The pushed photo is portrait
        self.photoImageViewRatio = self.photoImageView.frame.size.height / self.pushedPhoto.size.height;
    } else {
        // The pushed photo is landscape
        self.photoImageViewRatio = self.photoImageView.frame.size.width / self.pushedPhoto.size.width;
    }

} else {
    // This is device and image view is portrait
    if (self.pushedPhoto.size.height < self.pushedPhoto.size.width) {
        // The pushed photo is portrait
        self.photoImageViewRatio = self.photoImageView.frame.size.width / self.pushedPhoto.size.width;

    } else {
        // The pushed photo is landscape
        self.photoImageViewRatio = self.photoImageView.frame.size.height / self.pushedPhoto.size.height;
    }
}

self.valueHeight = self.pushedPhoto.size.height * self.photoImageViewRatio;
self.valueWidth = self.pushedPhoto.size.width * self.photoImageViewRatio;




float x =  (self.photoImageView.frame.size.width - self.valueWidth) / 2;
float y = (self.photoImageView.frame.size.height - self.valueHeight) /2;
于 2013-07-29T16:04:29.103 に答える