UILabel でタッチされたことを検出する : Objective-C プログラミング

PROGRAM


UILabel でタッチされたことを検出する

UILabel は、標準ではタッチされたことを検出できない様子です。

UILabel でタッチされたことを検出するには、UILabel の派生クラスを作成して、そこで touchesBegain:withEvent: 等をオーバーライドします。

 

このとき、UILabel は既定では userinteractionEnabled が NO に設定されるようなので、これを YES に設定するのも忘れないようにします。

Interface Builder でそれにチェックが入っていても、プログラム側で YES に設定しないといけないところに注意します。

 

この辺りに考慮して、UILabel でタッチを検出するコードは、次のような感じになりました。

 

EzSampleLabel.h

// クラスは UILabel から派生させます。

#import <UIKit/UIKit.h>

 

@interface EzSampleLabel : UILabel

 

@end

EzSampleLabel.m

// クラスは UILabel から派生させます。

#import "EzSampleLabel.h"

 

@implementation EzSampleLabel

 

// Objective-C コードからのインスタンス化の場合は init や initWithFrame: で初期化します。

- (id)initWithFrame:(CGRect)frame

{

self = [super initWithFrame:frame];

 

if (self)

{

// UILabel で touchesBegan:withEvent: 系をハンドルするには、userInteractionEnabled を YES にする必要があります。

self.userInteractionEnabled = YES;

}

 

return self;

}

 

// Storyboard や NIB からのインスタンス化の場合は initWithCoder: で初期化します。

- (id)initWithCoder:(NSCoder *)aDecoder

{

self = [super initWithCoder:aDecoder];

 

if (self)

{

// UILabel で touchesBegan:withEvent: 系をハンドルするには、userInteractionEnabled を YES にする必要があります。

self.userInteractionEnabled = YES;

}

 

return self;

}

 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

// ここで、タッチが開始されたときの処理を記載します。

 

}

 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

{

// ここで、タッチが終了したときの処理を記載します。

 

}

 

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event

{

// ここで、タッチがキャンセルされたときの処理を記載します。

 

}

 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

{

// ここで、タッチが移動されたときの処理を記載します。

 

}

このような UILabel の派生クラスを作成して使用することで、タッチを検出することができました。

Interface Builder でこのクラスを使用したい場合には、まずは UILabel を貼り付けた上で、その "Identity Inspector" の "Custom Class" で、Class を UILabel からここでは EzSampleLabel に変更します。

 

なお、Interface Builder で作成した UI が読み込まれるときには、各コンポーネントは initWithCoder: で初期化されるので、必要な初期化はそこで行います。

ちなみに Outlet などの連結は initWithCorder: が終わった後に行われるようなので、それを踏まえた初期化をしたいような場合には awakeFromNib をオーバーライドしてそこで行うようにします。

このような辺りを踏まえて作成した サンプルコード を GitHub にアップロードしてありますので、必要であればそちらもご覧ください。

[ もどる ]