41

カスタム 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;
}
4

9 に答える 9

34

このクラスは、ハイライト状態についてのみ通知しますが、視覚的な外観は変更しません。セルの背景を変更するなど、プログラムで行う必要があります。

詳細はCollectionView プログラミング ガイドに記載されています。

于 2013-01-31T23:33:53.967 に答える
33

SAEが言ったように、サブクラスで自分でやらなければなりません。私が遭遇したもう 1 つの障害は、セルをタップすると、セルが長押しされた場合にハイライトが表示され、再描画されていたことです。ただし、すばやくタップすると、再描画は発生しませんでした。

ストーリーボードにセルを作成しましたが、コレクション ビューにはデフォルトで「コンテンツ タッチの遅延」がチェックされています。これのチェックを外すと、指が画面に触れた瞬間に表示されました。

isHighlighted 値をチェックするカスタム描画ルーチンを使用しています。また、以下のようにカスタム セルで setHighlighted をオーバーライドする必要があります。そうしないと、描画ルーチンが呼び出されません。

-(void)setHighlighted:(BOOL)highlighted
{
    [super setHighlighted:highlighted];
    [self setNeedsDisplay];
}
于 2013-02-01T23:43:17.620 に答える
32

実装する必要がある 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 ];
}
于 2014-08-12T08:06:39.793 に答える
7

これらの行を UICellView のセットアップに追加することで、描画するハイライトを取得できます。

UIView* selectedBGView = [[UIView alloc] initWithFrame:self.bounds];
selectedBGView.backgroundColor = [UIColor redColor];
self.selectedBackgroundView = selectedBGView;

「選択とハイライトの表示状態の管理」より... コレクション ビューはデフォルトで単一項目の選択をサポートし、複数項目の選択をサポートするように構成したり、選択を完全に無効にしたりすることができます。コレクション ビューは、その境界内のタップを検出し、それに応じて対応するセルを強調表示または選択します。ほとんどの場合、コレクション ビューはセルのプロパティのみを変更して、セルが選択または強調表示されていることを示します。1 つの例外を除いて、セルの外観は変わりません。セルの selectedBackgroundView プロパティに有効なビューが含まれている場合、セルが強調表示または選択されると、コレクション ビューにそのビューが表示されます。

于 2013-10-28T18:46:50.133 に答える
4

SAEが指摘しているように、強調表示されたセルで手動で行う必要があります。私が見つけた最も簡単な方法は、tableviewのdidHighlightRowAtIndexPathおよびdidUnhighlightRowAtIndexPathメソッドを使用して、UICollectionCellインスタンスで「強調表示」されたboolを設定し、サブクラス化された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()
        }
    }
}
于 2015-07-02T14:18:43.320 に答える