web-dev-qa-db-fra.com

Pourquoi UICollectionView UICollectionViewCell ne met pas en évidence sur le toucher de l'utilisateur?

J'ai une UICollectionView composée d'une sous-classe UICollectionViewCell personnalisée. Les cellules s'affichent correctement et répondent correctement aux touches de l'utilisateur en tirant cette méthode:

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath

Cependant, je pense que lorsqu'un utilisateur touche la cellule, elle doit être mise en surbrillance (en bleu), puis la surbrillance devrait disparaître lorsque l'utilisateur lève le doigt. Cela n'arrive pas. Des réflexions sur pourquoi?

Voici un code pertinent:

Dans la source de données 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;
}

Dans l'implémentation d'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;
}
39
IkegawaTaro

La classe ne vous parle que de l'état de surbrillance, mais ne change pas l'apparence visuelle. Vous devrez le faire par programme, par ex. changer l'arrière-plan de la cellule.

Les détails sont décrits dans le Guide de programmation de CollectionView .

33
SAE

Comme l'a dit SAE, vous devez le faire vous-même dans une sous-classe. L'autre accroc que je viens de rencontrer est que lorsque vous appuyez sur une cellule, elle reçoit le reflet et se redessine si la cellule est maintenue enfoncée. Cependant, si vous appuyez rapidement, le redessin ne se produit jamais.

J'avais créé la cellule dans le storyboard et la vue de la collection a "retarde les contacts de contenu" cochée par défaut. J'ai décoché ceci et il a affiché instantanément le doigt a touché l'écran.

J'utilise une routine de dessin personnalisée qui vérifie la valeur isHighlighted. Vous devez également remplacer setHighlighted dans la cellule personnalisée comme ci-dessous ou la routine de dessin ne sera jamais appelée.

-(void)setHighlighted:(BOOL)highlighted
{
    [super setHighlighted:highlighted];
    [self setNeedsDisplay];
}
32
Ajaxharg

Vous devez implémenter 2 méthodes de délégué:

- (void)collectionView:(UICollectionView *)colView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath;
- (void)collectionView:(UICollectionView *)colView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath;

Code complet de mise en évidence de la cellule de vue de la collection avec animation:

- (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 ];
}
31
ashakirov

Vous devez implémenter ICollectionViewDataSource si vous souhaitez avoir un effet de surbrillance et de non-surbrillance au toucher et relâcher le toucher

voici l exemple de code

#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;
 }
8
Basil Mariano

Vous pouvez obtenir un hilight à dessiner en ajoutant ces lignes à la configuration de votre UICellView.

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

Dans "Gestion de l'état visuel des sélections et des faits saillants" ... Les vues de collection prennent en charge la sélection d'un seul élément par défaut et peuvent être configurées pour prendre en charge la sélection de plusieurs éléments ou avoir des sélections désactivées. La vue de collection détecte les taps à l'intérieur de ses limites et met en surbrillance ou sélectionne la cellule correspondante en conséquence. Pour la plupart, la vue de collection modifie uniquement les propriétés d'une cellule pour indiquer qu'elle est sélectionnée ou mise en surbrillance; cela ne change pas l'apparence visuelle de vos cellules, à une exception près. Si la propriété selectedBackgroundView d'une cellule contient une vue valide, la vue de collection montre cette vue lorsque la cellule est mise en surbrillance ou sélectionnée.

7
troppoli

Comme le souligne SAE, vous devrez le faire manuellement dans la cellule en surbrillance. La manière la plus simple que j'ai trouvée consiste à utiliser les méthodes didHighlightRowAtIndexPath et didUnhighlightRowAtIndexPath de tableview qui définissent un bool "surligné" dans votre instance UICollectionCell, puis remplacent cette propriété dans une classe UICollectionCell sous-classée. La beauté de cela est que l'animation est déjà là pour vous. Vous pouvez également faire de même dans une situation UITableView/UITableViewCell.

Donc, dans votre UICollectionView en utilisant la méthode UICollectionViewDelegate:

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)
}

Ensuite, dans votre sous-classe UICollectionViewCell, ajoutez ceci:

override var highlighted:Bool{
    didSet{
        println("Highlighted is set \(highlighted)")
        if(highlighted == true){
            self.backgroundColor = UIColor.redColor()
        }else{
            self.backgroundColor = UIColor.blueColor()
        }
    }
}
4
Tim
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];
        }
    }
1
KSR

vous pouvez essayer ce code:

- (void)collectionView:(UICollectionView *)colView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell* cell = [colView cellForItemAtIndexPath:indexPath];
cell.contentView.backgroundColor = [UIColor blueColor];
}

et

- (void)collectionView:(UICollectionView *)colView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell* cell = [colView cellForItemAtIndexPath:indexPath];
cell.contentView.backgroundColor = nil;
}
1
Ha cong Thuan

Si vous souhaitez modifier les visuels, vous pouvez définir la cellule sur sélectionné sur didHighlightItemAtIndexPath et désélectionner sur didHighlightItemAtIndexPath comme suit:

- (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];
}
0
Frank