27 votes

iPhone UITableView - Bouton Supprimer

J'utilise la fonctionnalité «glisser pour supprimer» de UITableView .

Le problème est que j'utilise un UITableViewCell qui est créé par article dans

 - (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 

J'ai besoin de modifier la position du bouton de suppression (simplement pour le déplacer d'environ 10 pixels vers la gauche), comment pourrais-je procéder?

Voici mon code existant pour créer la cellule:

 - (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"cellForRowAtIndexPath");
#if USE_CUSTOM_DRAWING
    const NSInteger TOP_LABEL_TAG = 1001;
    const NSInteger BOTTOM_LABEL_TAG = 1002;
    UILabel *topLabel;
    UILabel *bottomLabel;
#endif

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        //
        // Create the cell.
        //
        cell =
        [[[UITableViewCell alloc]
          initWithFrame:CGRectZero
          reuseIdentifier:CellIdentifier]
         autorelease];

#if USE_CUSTOM_DRAWING


        const CGFloat LABEL_HEIGHT = 20;
        UIImage *image = [UIImage imageNamed:@"trans_clock.png"];

        //
        // Create the label for the top row of text
        //
        topLabel =
        [[[UILabel alloc]
          initWithFrame:
          CGRectMake(
                     image.size.width + 2.0 * cell.indentationWidth,
                     0.5 * (aTableView.rowHeight - 2 * LABEL_HEIGHT),
                     aTableView.bounds.size.width -
                     image.size.width - 4.0 * cell.indentationWidth
                     ,
                     LABEL_HEIGHT)]
         autorelease];
        [cell.contentView addSubview:topLabel];

        //
        // Configure the properties for the text that are the same on every row
        //
        topLabel.tag = TOP_LABEL_TAG;
        topLabel.backgroundColor = [UIColor clearColor];
        topLabel.textColor = fontColor;
        topLabel.highlightedTextColor = [UIColor colorWithRed:1.0 green:1.0 blue:0.9 alpha:1.0];
        topLabel.font = [UIFont systemFontOfSize:[UIFont labelFontSize]];

        //
        // Create the label for the top row of text
        //
        bottomLabel =
        [[[UILabel alloc]
          initWithFrame:
          CGRectMake(
                     image.size.width + 2.0 * cell.indentationWidth,
                     0.5 * (aTableView.rowHeight - 2 * LABEL_HEIGHT) + LABEL_HEIGHT,
                     aTableView.bounds.size.width -
                     image.size.width - 4.0 * cell.indentationWidth
                     ,
                     LABEL_HEIGHT)]
         autorelease];
        [cell.contentView addSubview:bottomLabel];

        //
        // Configure the properties for the text that are the same on every row
        //
        bottomLabel.tag = BOTTOM_LABEL_TAG;
        bottomLabel.backgroundColor = [UIColor clearColor];
        bottomLabel.textColor = fontColor;
        bottomLabel.highlightedTextColor = [UIColor colorWithRed:1.0 green:1.0 blue:0.9 alpha:1.0];
        bottomLabel.font = [UIFont systemFontOfSize:[UIFont labelFontSize] - 2];

        //
        // Create a background image view.
        //
        cell.backgroundView =
        [[[UIImageView alloc] init] autorelease];
        cell.selectedBackgroundView =
        [[[UIImageView alloc] init] autorelease];
#endif
    }

#if USE_CUSTOM_DRAWING
    else
    {
        topLabel = (UILabel *)[cell viewWithTag:TOP_LABEL_TAG];
        bottomLabel = (UILabel *)[cell viewWithTag:BOTTOM_LABEL_TAG];
    }
    topLabel.text  = @"Example Text";
    topLabel.textColor = fontColor;

    bottomLabel.text = @"More Example Text";
    bottomLabel.textColor = fontColor;

    //
    // Set the background and selected background images for the text.
    // Since we will round the corners at the top and bottom of sections, we
    // need to conditionally choose the images based on the row index and the
    // number of rows in the section.
    //
    UIImage *rowBackground;
    UIImage *selectionBackground;
    NSInteger sectionRows = [aTableView numberOfRowsInSection:[indexPath section]];
    NSInteger row = [indexPath row];
    if (row == 0 && row == sectionRows - 1)
    {
        rowBackground = [UIImage imageNamed:@"topAndBottomRow.png"];
        selectionBackground = [UIImage imageNamed:@"topAndBottomRowSelected.png"];
    }
    else if (row == 0)
    {
        rowBackground = [UIImage imageNamed:@"topRow.png"];
        selectionBackground = [UIImage imageNamed:@"topRowSelected.png"];
    }
    else if (row == sectionRows - 1)
    {
        rowBackground = [UIImage imageNamed:@"bottomRow.png"];
        selectionBackground = [UIImage imageNamed:@"bottomRowSelected.png"];
    }
    else
    {
        rowBackground = [UIImage imageNamed:@"middleRow.png"];
        selectionBackground = [UIImage imageNamed:@"middleRowSelected.png"];
    }
    ((UIImageView *)cell.backgroundView).image = rowBackground;
    ((UIImageView *)cell.selectedBackgroundView).image = selectionBackground;

    cell.imageView.image = [UIImage imageNamed:@"Example_Image.png"];
#else
    cell.text = @"Example";
#endif
    return cell;
}
 

Merci d'avoir pris le temps de lire ce post.

58voto

Remizorrr Points 1819

Pour moi, la meilleure façon de résoudre ce problème était de remplacer -(void)layoutSubviews en MyCell:UITableViewCell

Ici, vous pouvez voir non seulement la position personnalisée du bouton Supprimer, mais aussi le repositionnement des commandes Modifier et Réorganiser pour le mode Éditer

 - (void)layoutSubviews
{
    [super layoutSubviews];

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:0.0f];

    for (UIView *subview in self.subviews) {


        if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl"]) { 
            CGRect newFrame = subview.frame;
            newFrame.origin.x = 200;
            subview.frame = newFrame;
        }
        else if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellEditControl"]) {             
            CGRect newFrame = subview.frame;
            newFrame.origin.x = 100;
            subview.frame = newFrame;
        }
        else if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellReorderControl"]) {             
            CGRect newFrame = subview.frame;
            newFrame.origin.x = 200;
            subview.frame = newFrame;
        }
    }
    [UIView commitAnimations];
}
 

24voto

nonamelive Points 1960

Iwat code ne fonctionne pas pour moi. Mais cela fonctionne.

- (void)willTransitionToState:(UITableViewCellStateMask)etat {

 [super willTransitionToState:état];

 si ((état & UITableViewCellStateShowingDeleteconfirmationmask) == UITableViewCellStateShowingDeleteconfirmationmask) {

 pour (UIView *sous-vue dans l'auto.les sous-vues) {

 si ([NSStringFromClass([sous-vue de la classe]) isEqualToString:@"UITableViewCellDeleteConfirmationcontrol"]) { 

 sous-vue.hidden = OUI;
 sous-vue.alpha = 0.0;
}
}
}
}

- (void)didTransitionToState:(UITableViewCellStateMask)etat {

 [super didTransitionToState:état];

 if (etat == UITableViewCellStateShowingDeleteconfirmationmask || état == UITableViewCellStateDefaultMask) {
 pour (UIView *sous-vue dans l'auto.les sous-vues) {

 si ([NSStringFromClass([sous-vue de la classe]) isEqualToString:@"UITableViewCellDeleteConfirmationcontrol"]) {

 UIView *deleteButtonView = (UIView *)[sous-vue.les sous-vues objectAtIndex:0];
 CGRect f = deleteButtonView.cadre;
 f.de l'origine.x= 20;
 deleteButtonView.frame = f;

 sous-vue.hidden = NON;

 [UIView beginAnimations:@"anim" contexte:nil];
 sous-vue.alpha = 1.0;
 [UIView commitAnimations];
}
}
}
}

2voto

Ethan Points 296

Je n'ai pas été en mesure de changer quoi doit ressembler le bouton supprimer, mais vous pouvez modifier le texte. Peut-être que vous pouvez l'utiliser pour obtenir l'effet que vous recherchez?

Découvrez la suite de membre de l' UITableViewDelegate protocole:

- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath

En outre, vous pouvez détecter si le bouton supprimer est affiché par le sous-classement UITableViewCell et en remplaçant les suivantes:

- (void)willTransitionToState:(UITableViewCellStateMask)state
- (void)didTransitionToState:(UITableViewCellStateMask)state

Pour l'un de ces, à l'état de masque sera UITableViewCellStateShowingDeleteConfirmationMask lorsque le bouton supprimer est affiché.

Espérons que ces indices vous orienter dans la bonne direction.

2voto

Stefan Points 406

J'utilise une solution qui, à première vue, semble que le type de hacky mais en fait le truc et n'est pas en s'appuyant sur les sans-papiers api:

/**
 * Transition to state
 */
-(void)willTransitionToState:(UITableViewCellStateMask)state {

    if(state & UITableViewCellStateShowingDeleteConfirmationMask)
        _deleting = YES;
    else if(!(state & UITableViewCellStateShowingDeleteConfirmationMask))
        _deleting = NO;
    [super willTransitionToState:state];

}

/**
 * Reset cell transformations
 */
-(void)resetCellTransform {

    self.transform = CGAffineTransformIdentity;
    _background.transform = CGAffineTransformIdentity;
    _content.transform = CGAffineTransformIdentity;
}

/**
 * Move cell around if we are currently in delete mode
 */
-(void)updateWithCurrentState {

    if(_deleting) {

        float x = -20;
        float y = 0;
        self.transform = CGAffineTransformMakeTranslation(x, y);
        _background.transform = CGAffineTransformMakeTranslation(-x, -y);
        _content.transform = CGAffineTransformMakeTranslation(-x, -y);
    }
}

-(void)setFrame:(CGRect)frame {

    [self resetCellTransform];
    [super setFrame:frame];
    [self updateWithCurrentState];
}

-(void)layoutSubviews {

    [self resetCellTransform];
    [super layoutSubviews];
    [self updateWithCurrentState];
}

En gros, cela décale la position de la cellule et réajuste les parties visibles. WillTransitionToState juste définit une instance de la variable indiquant si la cellule est en mode suppression. Primordial setFrame était nécessaire pour prendre en charge la rotation du téléphone en mode paysage et vice-versa. Où _background est l'arrière-plan de la vue de ma cellule et _content est vue ajoutée à la contentView de la cellule, la tenue de toutes les étiquettes, etc.

1voto

slf Points 15327

Je ne sais pas de toute façon de "déplacer le bouton supprimer 10px à gauche". Cependant, vous pouvez animer la coutume contenu de votre cellule de tableau autour de la position statique de l'inamovible bouton supprimer en écoutant l' willTransitionToState: message à partir d'un UITableViewCell sous-classe, voir ici.

Pour citer les docs:

Les sous-classes de UITableViewCell peut mettre en œuvre cette méthode pour animer des modifications supplémentaires à une cellule quand il est en train de changer d'état. UITableViewCell les appels de cette méthode chaque fois qu'une cellule les transitions entre les états, tels que de l'état normal (par défaut) à le mode d'édition. La cellule personnalisé peut définir et de toutes nouvelles vues apparaissent avec le nouvel état. La cellule puis reçoit un message layoutSubviews (UIView), dans laquelle elle peut la position ces nouveaux points de vue dans leur dernière les emplacements pour le nouvel état. Les sous-classes doivent toujours faire appel à super quand substitution de cette méthode.

Ce que vous cherchez est l' UITableViewCellStateShowingDeleteConfirmationMask de la valeur. C'est un de ces moments où la création de UITableViewCell sous-classe peut-être mieux, donc à partir de la commande que vous êtes en création d'une instance de votre cellule personnalisé. Ensuite, la cellule peut juste régler lui-même comme animateLeft et animateRight et de gérer le fonctionnement interne de réglage de son propre sous-vues.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X