みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

objective-cで困っています教えてください

下記のようにUIViewの上にUIImageViewを配置し、そこにUIImageをUIViewContentModeScaleAspectFitで表示させています。
表示している画像タップして、座標をとりたいと考えています。
UIImageView(UIImage)上だけをタップのエリアにしたいのですが、画面全体がタップのエリアになってしまいます。また、画像のアスペクト比を維持しUIImageViewサイズに収まるように表示しているので、タップでとれたUIImageView上の座標と、画像上の座標にズレができてしまいます。UIImageViewサイズに収まるように表示された画像上の位置から元の画像の座標を取得する方法を教えてください。

#import "ViewController.h"
@interface ViewController (){
UIImageView *imageView;
}
@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

CGRect rect = CGRectMake(0,20, 360, 480);
imageView = [[UIImageView alloc] initWithFrame:rect];
imageView.backgroundColor = [UIColor redColor];
//画像のアスペクト比を維持しUIImageViewサイズに収まるように表示
imageView.contentMode = UIViewContentModeScaleAspectFit;
UIImage *image = [UIImage imageNamed:@"hoge.png"];
[imageView setImage:image];
[self.view addSubview:imageView];
}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

/**
* タッチされたとき
*/
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
CGPoint p = [[touches anyObject] locationInView:imageView];
float x = p.x; // X座標
float y = p.y; // Y座標
NSLog(@"タップ開始 %f, %f", x, y);
}
@end

投稿日時 - 2015-03-30 16:27:56

QNo.8945792

すぐに回答ほしいです

質問者が選んだベストアンサー

> UIImageView(UIImage)上だけをタップのエリアにしたいのですが、画面全体がタップのエリアになってしまいます。

これはUIImageViewのサブクラスを作り、そのサブクラスで
userInteractionEnabledをYESにしてtouchesBeganメソッドを
実装すれば、そのView上でタップされたイベントだけ拾うことが
できます。ただ、今回はそこまでやらなくても現状の通りViewController
でtouchesBeganイベントを拾って、そこでタップされた位置が
UIImageViewの範囲内かどうか判定する(範囲外なら何もしない)方が
簡単だと思います。
タップされた位置がUIImageViewの範囲内かどうかはCGRectContainsPoint
を使えば簡単にわかります。
(参考)
http://d.hatena.ne.jp/tchan0624/20110214/1297652472

> UIImageViewサイズに収まるように表示された画像上の位置から元の画像の座標を取得する方法を教えてください。

もし将来的にUIScrollViewの中にUIImageViewを置いて、その画像を
ユーザーが拡大/縮小/スクロールして画像位置を設定できるようにしたい
と思っているなら、UIScrollViewの中に元の画像と同じサイズのUIImageViewを
置いて、UIScrollViewでUIImageViewの拡大/縮小/スクロールをするような構造に
すれば、前回紹介したconvertXXX系のメソッドで座標変換できます。

そこまでするつもりはなくて、UIImageViewのサイズに収まるよう
UIViewContentModeScaleAspectFitで全体表示するだけのつもりなら
自分で計算して座標変換するしかないと思います。
だいたい以下のような感じでやれば、さほど難しくないとは思います。
1.元の画像の縦横サイズとimageViewの縦横サイズを元に縮小率を求める。
2.imageView上のタップ位置を縮小率で割って、元の画像サイズに換算する。
3.元の画像はimageViewの中央に表示されることを考慮して、中央にずらした分
座標位置を調整する。

投稿日時 - 2015-03-31 11:38:16

お礼

今回も回答ありがとうございました。convertXXX系のメソッドと1、2、3の手順で座標変換する計算でうまくいきました。またCGRectContainsPoint
を使って、特定の部分だけのタッチがとれるようになりました。毎回丁寧な対応に感謝しています。また、よろしくお願いします。

投稿日時 - 2015-04-01 22:11:51

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問