2011-08-14 7 views
8

私のアプリにはカスタムUITableViewがあります。 UIViewControllercellForRowAtIndexPath代理メソッドでは、コンテンツビューのサブビューとして複数のカスタムUILabel(実際にはサブクラスOHAttributedLabel)を含むカスタムUITableViewCellオブジェクトをインスタンス化しています。UITableViewCellのサブビューとしてUILabelのタッチイベントを処理する方法は?

私はラベルにuserInteractionEnabled = YESを設定してから、ビューコントローラでタッチイベントを追加しようとしましたが、動作しません。

アイデア?

おかげ

+0

正確には動作しません。あなたのタッチルーチンで正しい見方をしているかどうかチェックしましたか? – Mundi

+0

touchesメソッドは決してヒットしないので、チェックする必要はありません。 – Bama91

答えて

12
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
     UITouch *touch = [[event allTouches] anyObject]; 
     if (CGRectContainsPoint([self.site frame], [touch locationInView:self.view])){ 
     //do whatever you want 
    } 
} 

それとも

UILabel *label = =[UILabel alloc]init]; 
label.userInteractionEnabled = YES; 
UITapGestureRecognizer *tapGesture = 
[[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelTap)]  autorelease]; 
[label addGestureRecognizer:tapGesture]; 
+0

あなたの最初の提案について...私はtouchesBeganとtouchesEndedイベントを私のUILabelサブクラスと親ビューコントローラに追加しましたが、ラベルをタッチするとコードはヒットしません(カスタムラベルのuserInteractionEnabledプロパティがYESに設定されています) )。私は何が欠けているのか分からない。 – Bama91

+0

@ Bama91なぜイベントが呼び出されていないのか分かりませんあなたは何か悪いと思っています。私の2番目の提案はどうやってやったのですか? UILabelの代わりに* label = = [UILabel alloc] init;カスタムクラスラベルで作成し、ジェスチャ認識機能を追加する必要があります。 –

+0

私の悪い。数ヶ月前に、私は親のUITableViewCellのinitWithStyleメソッドで "userInteractionEnabled = NO"を設定していました。それをコメントした後、タッチイベントは期待通りに機能しています。また、私はOHAttributedLabelが既にタッチイベントを処理していることが分かりましたので、私はそのサブクラスでそれを認識する必要がありました。 – Bama91

1

あなたがUIControlEventTouchUpInsideまたは同様のイベントを取得することはできませんので、A UILabelはUicontrolのではありません。代わりにボタンを使用してみませんか?ラベルのように見えるようにすることができます。

おそらく、あなたのcellForRowAtIndexPath:メソッドのaddTarget:action:forControlEvents:とUIButtonのタグを設定する必要があります。その方法では、タグの値を調べて、どのセルのボタンがタップされたかを検出します。

UILabelを使用する必要がある場合は、サブクラス化してUIControlEventTouchUpInsideを検出するtouchesBegan/touchesEndedメソッド(UIResponderから継承)を傍受する必要があります。

+0

私はOHAttributedLabelのサブクラスを使用しています。それ自体はUILabelのサブクラスであり、属性付きテキスト機能が追加されています。上記の私のコメントで述べたように、ラベルに触れると、私のサブクラスに追加されたtouchesBeganとtouchesEndedメソッドは決してヒットしません。 – Bama91

0

私はラベルを付け加えてタッチを認識することができませんでしたが、最終的にはそれがサブビューとして追加されていることに気付きましたが、フレームがその親の枠の外にあったため、タッチの階層が破られました。

1

OHAttributedLabelの問題です。このラベルはリンクのタップも処理します。だから、(単にリンクしていない)のラベルの任意のポイントにハンドルをタップあなたはself.textLabelがあなたのOHAttributedLabel

self.textLabel.onlyCatchTouchesOnLinks = NO; 

である必要がありますについて。 そして、userInteractionEnabledを忘れないでください。

0

スタティックテーブルセルを使用して設定テーブルに問題が発生しました。このテーブルでは、セル全体のテキストフィールドの最初のレスポンダをトリガする必要がありました。

ジェスチャーレコグナイザーを使用してタッチしていないと、ラベルの後に透明な(カスタムの空白のタイトルの)ボタンが追加されました。私はそれがよりエレガントな方法で動作するはずだと思うが、それは今のところその課題とその限られた目的を解決した。 (また、ボタンのデフォルトアクションから接続をドラッグすることができます)

Bit ugly。次に、それは触れることに反応するテキストフィールドの背後の領域を説明するだけです。結局のところ、それは意図だった。だから多分それはちょうどその空想。

認識装置が発射されない理由がわかるまで、それを維持します。

0

代わりにTTTAttributedLabelを使用できます。それは超簡単。 あなたはUITableViewCellの初期とき、あなたは委任することができますようTTTAttributedLabelDelegate :

@interface MyTableViewCell : UITableViewCell<TTTAttributedLabelDelegate>{ 
    UILabel *nameLabel; 
    TTTAttributedLabel *valueLabel; 
} 

あなたが最初の、あなたがラベルにリンクを追加することができるとき:

[valueLabel addLinkToPhoneNumber:valueStr withRange:NSMakeRange(0, valueStr.length)]; 

ので、あなたが欲しいものを行うことができます

関連する問題