iPhone プログラミングの中で、ボタンのクリックイベントは簡単に取れるのですが、ラベルや画像のクリックイベントが手軽に取れません。いくつか調べると、UITapGestureRecognizer を使うか、touchesEnded メソッドをオーバーライドするか、という方法があるのですが手軽でもないので。
iphone - How can I determine if a UILabel was touched? - Stack Overflow
http://stackoverflow.com/questions/2539380/how-can-i-determine-if-a-uilabel-was-touched
UILabelのタッチイベントを検出する方法 ? 拡張現実ライフ
http://akio0911.net/archives/3419
どうやら、tag を使うと一番手軽そうなので紹介しておきます。
最初に、viewDidLoad の中で tag を設定しておきます。userInteractionEnabled プロパティの値を YES にしておかないとイベントが発生しなくなるので注意してください(何故イベントが発生しないのかは不明)
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
labelCommand.userInteractionEnabled = YES;
labelCommand.tag = 100;
imageLogo.userInteractionEnabled = YES;
imageLogo.tag = 101;
}
「100」とか「101」とかは、適当な値で十分です(0は初期値なので駄目)。
#define しても良いのですが、使い捨てなのでそのまま。
touchesBegan イベントをオーバーライドします。ViewController 上にあるイベントをタッチイベントを全てフックするので、これから目的のオブジェクトを探し出します。
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [[event allTouches] anyObject];
if ( touch.view.tag == labelCommand.tag )
[self clickCommand:labelCommand];
else if ( touch.view.tag == imageLogo.tag )
[self clickLogo:imageLogo];
}
ここで、touch.view.tag と、ラベルの tag の値とを比較します。本来は switch で比較するのが良いのでしょうが、面倒なので(苦笑)そのまま tag の値と比較しています。実は、こうすると #define が必要なくなるのです。
イベントは、ボタンのクリックイベントのように書きたいため、ViewController 上で定義した clickCommand を呼び出します。一応、sender はラベルや画像オブジェクトそのもの渡します。
-(IBAction)clickCommand:(id)sender
{
NSLog(@"in clickCommand");
}
-(IBAction)clickLogo:(id)sender
{
NSLog(@"in clickLogo");
}
こんな風に、あたかもボタンと同じようにしておきます。こうすると、クリックイベントみたいで分かり易いですよね。
実行すると、普通のボタンと同じようにログが出力されます。



