ペン先ごとに作成しUICollectionViewCell
、その中にボタンを追加し、.h ファイルと .m ファイルを作成してクラスをペン先に追加し、file's owner
アウトレット経由で接続された .m にボタン アクションを記述しました。
コレクション ビューは正常に表示されていますが、ボタン アクションをトリガーできません。コレクションセルのデリゲートが呼び出されると思います。
ボタンアクションを取得するにはどうすればよいですか?
ペン先ごとに作成しUICollectionViewCell
、その中にボタンを追加し、.h ファイルと .m ファイルを作成してクラスをペン先に追加し、file's owner
アウトレット経由で接続された .m にボタン アクションを記述しました。
コレクション ビューは正常に表示されていますが、ボタン アクションをトリガーできません。コレクションセルのデリゲートが呼び出されると思います。
ボタンアクションを取得するにはどうすればよいですか?
私もこの問題を抱えていました。サブビューはタッチ イベントを受け取りません。Scott K の回避策は機能しますが、それでも何かがおかしいと感じました。そこでペン先をもう一度見てみると、UICollectionViewCell を作成するために使用した元のサブビューが UIView であることに気付きました。クラスを UICollectionViewCell のサブクラスに変更しても、XCode はそれをまだ UIView と見なしているため、contentView で発生する問題はタッチ イベントをキャッチしません。
これを修正するために、UICollectionViewCell オブジェクトを確実にドラッグし、すべてのサブビューをそれに移動することでペン先を再作成しました。その後、タッチ イベントがセルのサブビューで機能し始めました。
ペン先が UICollectionViewCell として構成されているかどうかを確認するインジケーターは、高レベル ビューのアイコンを見てください。
このように見えない場合は、おそらくタッチ イベントの解釈が間違っている可能性があります。
nib を介してを作成するUICollectionViewCell
と、nib のコンテンツはセルの contentView に追加されません。すべてが直接UICollectionViewCell
. Interface Builder に nib の最上位ビューを として認識させる方法はないようですUICollectionViewCell
。そのため、「自動的に」内部のすべてのコンテンツが contentView に追加されます。
sunkehappy が指摘したように、タッチ イベントを受け取りたいものはすべて contentView に入れる必要があります。すでに作成されているので、プログラムUIButton
で awakeFromNib 時間に contentView に移動するのが最善の方法です。
-(void)awakeFromNib {
[self.contentView addSubview:self.myButton];
}
UICollectionViewCell クラス リファレンス
セルの外観を構成するには、データ項目のコンテンツをサブビューとして表示するために必要なビューを contentView プロパティのビューに追加します。サブビューをセル自体に直接追加しないでください。セルはコンテンツの複数のレイヤーを管理しますが、コンテンツ ビューはそのうちの 1 つにすぎません。セルは、コンテンツ ビューに加えて、セルを選択状態と非選択状態で表示する 2 つの背景ビューを管理します。
awakeFromNib
次のようにボタンを追加できます。
- (void)awakeFromNib
{
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
[button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
[self.contentView addSubview:button];
}
- (void)buttonClicked:(id)sender
{
NSLog(@"button clicked");
}
追加して解決しました
[self bringSubviewToFront:myButton];
の中へawakeFromNib
セルの下部にあるサブビューがタッチイベントを受信しないという同様の問題がありましたが、上部は正常に機能していました。そこで、調査を開始し、次の結果を得ました。
Interface Builderのセルの「サブビューの自動サイズ変更」をYESに設定すると、問題が解決しました!
UICollectionViewCell で CollectionView のハンドルを作成する
UICollectionViewCell の .h ファイル内
@property (nonataomic, retain) UICollectionView *collView;
UICollectionViewCell の .m ファイル内
@synthesize *collView;
次に、コントローラーの実装ファイルで、foll メソッドでコレクション ビューを設定します。
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
YourCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:homePageCollViewCellIdentifier forIndexPath:indexPath];
//NSString *str = [NSString stringWithFormat:@"HP item %d", indexPath.row+1];
cell.collView = self.theCollectionView;
}
UICollectionViewCell の実装で
- (void)awakeFromNib
{
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
[button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
[self.contentView addSubview:button];
}
Button Clicked メソッドで
-(void)buttonClicked:(id)sender
{
NSLog(@"button clicked");
NSIndexPath *indPath = [collVw indexPathForCell:self];
[collVw.delegate collectionView:self.collVw didSelectItemAtIndexPath:indPath];
}