2009-04-25 27 views
19

私はUITableViewCellUIButtonサブビューを持っています。このボタンをタッチするとUIButtonの遅延状態の変更

、ユーザーがUIControlStateHighlighted画像に変更するには、ボタンのイメージのために第二約半分のためのボタンを押したままにしなければなりません。

これは、ユーザーが通常のようにボタンをタップするだけで、強調表示された状態が決して表示されないことを意味します。

なぜこのようなことが発生し、どうすれば解決できますか?

+0

これはSimulatorまたはデバイスでですか? –

答えて

0

編集:完全に書き直され、質問の誤解以下UIButtonの思考の

一つの方法は、様々な瞬間タッチイベント応答に応答することができ、画面の面積を設定するための簡単な方法としてありますUIControlのTarget-Actionシステムによって定義され、他のオブジェクトにメッセージを配信します。

UIControlEventTouchDownは、応答する必要があるようです。これは、誰かがあなたのボタンの中に触れるとすぐに起動されます。これが、SMSの「連絡先情報」ボタンの機能です。

UIButton * myButtonという= [[UIButton buttonWithType:UIButtonTypeRoundedRect]。 // SEt upタイトル、フレームなど [myButton addTarget:自己アクション:@selector(myButtonWasPressed)forControlEvents:UIControlEventTouchDown]; [myMainView addSubView:myButton];

は、このコードは(理想的にはあなたがコントローラを表示)から実行オブジェクトに-(void)myButtonWasPressedメッセージを送信します。 myButtonWasPressedでは、新しいビューを追加したり、好きなような行動を取ることができます。 SMSアプリケーションは、ナビゲーションコントローラを使用して連絡先情報を表示するビューコントローラをプッシュします。

これはまだ問題が解決しない場合、あなたは間違って起こっていることに多くの洞察を得るためにいくつかのコードをポストする必要があるとしています。

+0

私はあなたが誤解していると思います。 たとえば、SMSアプリケーションを見ると、メッセージスレッドの上部にあるアイコンが即座に反応して接触します。 私のボタンは強調表示された状態に即座に反応しないと言っています。 私は、ユーザーがボタンを押し続けないようにしたい。 ボタンを通常どおりに使用したいが、ボタンの状態が変更され、ボタンの外観に反映されるようにする。 –

+0

さて、まだ誤解があります:)。 ボタンの操作やイベントに問題はありません。 私が何を記述しているかを再現するには、新しいUITableViewCellを作成し、そのサブビューとしてUIButtonを追加します。つまり、[cell.contentView addSubview:button]です。 次に、デバイスでテストします。ボタンをタッチすると、アクションは正しく実行されますが、ボタンの強調表示された状態はすぐには発生しません。むしろ、ボタンを半減させてから、ボタンを視覚的に*変えた状態にする必要があります。 私が話しているのは、ボタンの外観です。 –

10

問題は、UIButtonがUITableViewの内部にあることです。つまり、テーブルビューではタップがスワイプになるのか、それともボタンのタップにすぎないのかを判断する必要があります。ユーザーがスワイプしないようになるまで、そしてボタンを押す代わりにビューをスクロールすることを知るまで、テーブルビューはメッセージをUIButtonに送るのを遅らせる必要があります。

テーブルビューが必要ない場合は、UITableViewを削除してください。

+0

これも同様ですが、このコメントで私の唯一の問題は、UISwitchのような別のコントロールを使用すると、そのような遅れが発生しないということです。 – d2burke

3

私はちょうどターゲットアクションメソッド内からの画像を変更します。

[sender setBackgroundImage:[UIImage imageNamed:@"highlighted-image.png"] forState:UIControlStateNormal]; 

それは瞬時に背景画像を変更します。

+0

それは動作します、ありがとう! –

25

この問題が発生したばかりで、この問題が解決されていないことがわかりました。しばらくの間ねじ回した後、私はそれのための修正を見つけた。

今、あなたはdelaysContentTouchesをオフにするか、テーブルビューの「遅延コンテンツタッチ」ボックスのチェックを外すことでこの問題を解決することができます。

のみ負の副作用は、ユーザがボタンを下にタップし、スクロールジェスチャーを開始することができないということです。ただし、ユーザーが接触しない場所からスクロールしようとすると、その動作は以前と同じになります。

+0

私はこれを解決するためにおそらく8時間を費やしました。どうもありがとうございます。 – maxhud

+0

私はscrollview上のUIButtonで同じ問題を抱えていました。これで修正されました。 –

+0

これは私のために、ありがとう。 –

10

デビッド・ホッジの答えのためにアップ。

私はちょうどデイヴィッドが説明した「負の副作用」を取り除く方法を追加したいだけです:delayContentTouches = NOのUIScrollViewでUIcontrolをスクロールし始めると、スクロールが機能しません。 (元の質問として、あるいはのUITableView)

SOLUTION サブクラスUIScrollViewのをして上書き:

-(BOOL) touchesShouldCancelInContentView:(UIView *)view { 
return YES; 
} 

UIScrollViewの/のUITableView内のあなたのUIコントロールをタップですぐに自分の状態を変更し、scrollviewsもスクロールすることができるようになりますいくつかのUIControlでタッチが開始された場合。魅力のように動作します。

+0

決して呼び出されません。 –

関連する問題