2012-11-26 11 views
8

UICollectionView補助ビュー(フッター)にUIButtonを配置しようとしています。私は、UICollectionViewCellのサブクラスにストーリーボードを使用してUIButtonを接続し、プログラムのプロパティを変更することができます。しかし、ボタンの内部のタッチアップをメソッドにアップすると、メソッドは起動しません。実際には、ボタンはユーザーのタッチに視覚的に反応しているようには見えません。トラブルシューティングでは、UIButtonをコレクションビューのヘッダーに追加しようとしましたが、同じ動作が見られます。無関係なビューにボタンを追加すると、押したときに相互作用の効果が生じます。UICollectionの補助ビューでUIButtonを使用するにはどうすればよいですか?

UICollection補足ビューでUIButtonを実装するために何か特別なことはありますか?

答えて

16

補助ビューは、UICollectionViewCellではなく、UICollectionReusableView(またはそのサブクラス)である必要があります。

とにかく、ボタンが応答しない場合は、先祖のすべてのビューにuserInteractionEnabledYESに設定されていることを確認する必要があります。

(lldb) po [[UIApp keyWindow] recursiveDescription] 

リスト内のボタンを見つけて、そのアドレスをコピーします。次に、それと各スーパービューをチェックすることができます。例:

(lldb) p (BOOL)[0xa2e4800 isUserInteractionEnabled] 
(BOOL) $4 = YES 
(lldb) p (BOOL)[[0xa2e4800 superview] isUserInteractionEnabled] 
(BOOL) $5 = YES 
(lldb) p (BOOL)[[[0xa2e4800 superview] superview] isUserInteractionEnabled] 
(BOOL) $6 = YES 
(lldb) p (BOOL)[[[[0xa2e4800 superview] superview] superview] isUserInteractionEnabled] 
(BOOL) $8 = YES 
(lldb) p (BOOL)[[[[[0xa2e4800 superview] superview] superview] superview] isUserInteractionEnabled] 
(BOOL) $9 = YES 
(lldb) p (BOOL)[[[[[[0xa2e4800 superview] superview] superview] superview] superview] isUserInteractionEnabled] 
(BOOL) $10 = NO 
(lldb) po [[[[[0xa2e4800 superview] superview] superview] superview] superview] 
(id) $11 = 0x00000000 <nil> 

は、ここで私は、ルート( UIWindow)までのすべてのビューが isUserInteractionEnabledから YESを返すことがわかりました。ウィンドウのスーパービューはnilです。

+1

@robmayhoff:問題は私が間違った親をサブクラス化したという事実でした。これをキャッチしていただきありがとうございます! – markdorison

+0

@markdorisonハハ、面白いです。私はそれが本当に問題だとは思っていませんでした。 –

+0

@robmayhoff:私は1つの変更を加えたときと同じくらい驚きました。 – markdorison

0

私はUIControlをサブクラス化し、UICollectionReusableViewの中に入れたカスタムボタンを持っています。それを動作させるために、コントロールのすべての単一のサブビューを作成し、そのサブビューのサブビューはユーザーの操作を処理しません。 .TouchUpInsideに、すべてのイベントリスナーをそのコードを追加して以来

func disableUserInteractionInView(view: UIView) { 
    view.userInteractionEnabled = false 
    for view in view.subviews { 
     self.disableUserInteractionInView(view) 
    } 
} 

// My control has a subview called contentView which serves as a container 
// of all my custom button's subviews. 
self.disableUserInteractionInView(self.contentView) 

は火だろう、と押したときにコントロールが視覚的に強調表示されます。