カスタムUICollectionViewCellサブクラスで構成されるUICollectionViewがあります。セルは正しく表示されており、このメソッドを起動することによりユーザーのタッチに正しく応答しています:
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
ただし、ユーザーがセルに触れると、セルが強調表示(青色)され、ユーザーが指を離すと強調表示が消えるということを理解しています。これは起きていません。理由について何か考えはありますか?
関連するコードは次のとおりです。
UICollectionViewのデータソースで:
@implementation SplitCheckViewCollection
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
static NSString *cellIdentifier = @"ReceiptCellIdentifier";
SplitCheckCollectionCell *cell = (SplitCheckCollectionCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
cell.cellName.text = [NSString stringWithFormat:@"%@%i",@"#",indexPath.row+1];
return cell;
}
UICollectionViewCellの実装では:
@implementation SplitCheckCollectionCell
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"SplitCheckCollectionCell" owner:self options:nil];
if ([arrayOfViews count] < 1) {
return nil;
}
if (![[arrayOfViews objectAtIndex:0] isKindOfClass:[UICollectionViewCell class]]) {
return nil;
}
self = [arrayOfViews objectAtIndex:0];
}
return self;
}
このクラスは、ハイライト状態についてのみ通知しますが、視覚的な外観は変更しません。あなたはプログラムでそれをする必要がありますセルの背景を変更します。
詳細は CollectionView Programming Guide で説明されています。
SAEが言ったように、サブクラスで自分でやらなければなりません。私がちょうど遭遇した他の障害は、セルをタップするときに、セルが押されたままになっている場合にハイライトを受け取り、再描画することです。ただし、高速でタップすると、再描画は発生しませんでした。
ストーリーボードでセルを作成しました。コレクションビューには、デフォルトで「遅延コンテンツタッチ」がチェックされています。これにチェックを外すと、指が画面に触れた瞬間に表示されました。
IsHighlighted値をチェックするカスタム描画ルーチンを使用しています。また、以下のようにカスタムセルでsetHighlightedをオーバーライドする必要があります。そうしないと、描画ルーチンが呼び出されません。
-(void)setHighlighted:(BOOL)highlighted
{
[super setHighlighted:highlighted];
[self setNeedsDisplay];
}
実装する必要がある2つのデリゲートメソッドがあります。
- (void)collectionView:(UICollectionView *)colView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath;
- (void)collectionView:(UICollectionView *)colView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath;
コレクションビューのセルをアニメーションで強調表示する完全なコード:
- (void)collectionView:(UICollectionView *)colView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell* cell = [colView cellForItemAtIndexPath:indexPath];
//set color with animation
[UIView animateWithDuration:0.1
delay:0
options:(UIViewAnimationOptionAllowUserInteraction)
animations:^{
[cell setBackgroundColor:[UIColor colorWithRed:232/255.0f green:232/255.0f blue:232/255.0f alpha:1]];
}
completion:nil];
}
- (void)collectionView:(UICollectionView *)colView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell* cell = [colView cellForItemAtIndexPath:indexPath];
//set color with animation
[UIView animateWithDuration:0.1
delay:0
options:(UIViewAnimationOptionAllowUserInteraction)
animations:^{
[cell setBackgroundColor:[UIColor clearColor]];
}
completion:nil ];
}
タッチおよびハイライト解除時にハイライトおよびハイライト解除効果を有効にする場合は、ICollectionViewDataSourceを実装する必要があります
ここにサンプルコードがあります
#pragma mark - UICollectionView Datasource
- (void)collectionView:(UICollectionView *)colView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell* cell = [colView cellForItemAtIndexPath:indexPath];
cell.contentView.backgroundColor = [UIColor colorWithRed:235/255.0f green:236/255.0f blue:237/255.0f alpha:.5];
}
- (void)collectionView:(UICollectionView *)colView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell* cell = [colView cellForItemAtIndexPath:indexPath];
cell.contentView.backgroundColor = nil;
}
UICellViewのセットアップにこれらの行を追加することにより、描画するハイライトを取得できます。
UIView* selectedBGView = [[UIView alloc] initWithFrame:self.bounds];
selectedBGView.backgroundColor = [UIColor redColor];
self.selectedBackgroundView = selectedBGView;
「選択とハイライトの視覚状態の管理」から...コレクションビューは、デフォルトで単一項目選択をサポートし、複数項目選択をサポートするように構成するか、選択を完全に無効にすることができます。コレクションビューは、境界内のタップを検出し、それに応じて対応するセルを強調表示または選択します。ほとんどの場合、コレクションビューはセルのプロパティのみを変更して、選択または強調表示されていることを示します。 1つの例外を除き、セルの視覚的外観は変更されません。セルのselectedBackgroundViewプロパティに有効なビューが含まれている場合、セルが強調表示または選択されるとコレクションビューにそのビューが表示されます。
SAEが指摘しているように、ハイライトのセルで手動で行う必要があります。私が見つけた最も簡単な方法は、tableCollection didHighlightRowAtIndexPathおよびdidUnhighlightRowAtIndexPathメソッドを使用して、UICollectionCellインスタンスでブールを「強調表示」し、サブクラス化されたUICollectionCellクラスでそのプロパティをオーバーライドすることです。この素晴らしい点は、アニメーションがすでにあなたのためにそこにあるということです。 UITableView/UITableViewCellの状況でも同じことができます。
UICollectionViewDelegateメソッドを使用してUICollectionViewで:
func collectionView(collectionView: UICollectionView, didHighlightItemAtIndexPath indexPath: NSIndexPath) {
collectionView.selectItemAtIndexPath(indexPath, animated: true, scrollPosition: UICollectionViewScrollPosition.None)
}
func collectionView(collectionView: UICollectionView, didUnhighlightItemAtIndexPath indexPath: NSIndexPath) {
collectionView.deselectItemAtIndexPath(indexPath, animated: true)
}
次に、UICollectionViewCellサブクラスでこれを追加します。
override var highlighted:Bool{
didSet{
println("Highlighted is set \(highlighted)")
if(highlighted == true){
self.backgroundColor = UIColor.redColor()
}else{
self.backgroundColor = UIColor.blueColor()
}
}
}
We can create our own highlight and unhighlight effect on collectionView cell by adding and removing a temporary view with some background color as follows:
-(void)collectionView:(UICollectionView *)collectionView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *collectionViewCell = (UICollectionViewCell *)
[collectionView cellForItemAtIndexPath:indexPath];
UIView *tapHighlightView = (UIView*)[collectionViewCell.contentView
viewWithTag:10];
if (!tapHighlightView) {
tapHighlightView = [[UIView alloc]
initWithFrame:collectionViewCell.contentView.frame];
tapHighlightView.backgroundColor =[UIColor blackColor alpha:0.4];
tapHighlightView.tag = 10;
[collectionViewCell.contentView addSubview:tapHighlightView];
}
}
-(void)collectionView:(UICollectionView *)collectionView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath{
UICollectionViewCell *collectionViewCell = (UICollectionViewCell *)[collectionView cellForItemAtIndexPath:indexPath];
UIView *tapHighlightView = (UIView*)[collectionViewCell.contentView viewWithTag:10];
if (tapHighlightView != nil) {
[tapHighlightView removeFromSuperview];
}
}
このコードを試すことができます:
- (void)collectionView:(UICollectionView *)colView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell* cell = [colView cellForItemAtIndexPath:indexPath];
cell.contentView.backgroundColor = [UIColor blueColor];
}
そして
- (void)collectionView:(UICollectionView *)colView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell* cell = [colView cellForItemAtIndexPath:indexPath];
cell.contentView.backgroundColor = nil;
}
ビジュアルを変更する場合は、didHighlightItemAtIndexPathでセルを選択済みに設定し、didHighlightItemAtIndexPathで次のように選択を解除できます。
- (BOOL)collectionView:(UICollectionView *)collectionView shouldHighlightItemAtIndexPath:(NSIndexPath *)indexPath
{
return YES;
}
- (void)collectionView:(UICollectionView *)collectionView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath
{
[collectionView selectItemAtIndexPath:indexPath animated:YES scrollPosition:NO];
}
- (void)collectionView:(UICollectionView *)collectionView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath
{
[collectionView deselectItemAtIndexPath:indexPath animated:YES];
}