2015-11-07 9 views
9

Desidero aggiungere pulsante all'angolo in alto a sinistra di UICollectionViewCell. Sono in grado di aggiungere il pulsante in alto a sinistra della cella ma non appare sopra la cella, ma sotto la cella. Per favore dimmi come posso farlo?Come aggiungere l'immagine all'angolo in alto a sinistra della cella uicollectionView in ios?

Sto usando sottostante Codice:
enter image description here

_deleteButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, delButtonSize, delButtonSize)]; 
    _deleteButton.center = CGPointMake(9, 10); 
    _deleteButton.backgroundColor = [UIColor clearColor]; 

    [_deleteButton setImage: [UIImage imageNamed:@"cross_30.png"] forState:UIControlStateNormal]; 
    [cell addSubview:_deleteButton]; 

    [_deleteButton addTarget:self action:@selector(deleteRecipe:) forControlEvents:UIControlEventTouchUpInside]; 

Edit:
Voglio fare eliminare un'icona come questa:
enter image description here

+0

tenta di eseguire il debug di set '_deleteButton.backgroundColor = [UIColor redColor];' E rimuovi questa riga '_deleteButton.center = CGPointMake (9, 10);' – anhtu

+0

E dove gestisci '_deleteButton'? – anhtu

+0

cosa intendi per .. "Sono in grado di aggiungere il pulsante in alto a sinistra della cella ma non appare sopra la cella ma sotto la cella", per favore fornisci ulteriori dettagli ... –

risposta

2

Hai provato l'aggiunta di alla vista del contenuto della cella? [cell.contentView addSubview:_deleteButton];

+0

Sì, non funziona. – Techiee

0

Penso che si sta utilizzando 1 pulsante per tutte le celle, cercano di creare 1 tasto per 1 cella:

UIButton * deleteButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, delButtonSize, delButtonSize)]; 
    deleteButton.center = CGPointMake(9, 10); 
    deleteButton.backgroundColor = [UIColor clearColor]; 

    [deleteButton setImage: [UIImage imageNamed:@"cross_30.png"] forState:UIControlStateNormal]; 
    [cell addSubview:deleteButton]; 
+0

Questo non è un problema. Questo approccio non funziona. Voglio migliorare la posizione del pulsante. – Techiee

1

Assicurati che il tuo cross_30 png dimensioni versione del file 1x corrisponde delButtonSize

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    //cell = ... 
    UIButton *testButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    testButton.frame = CGRectMake(0, 0, delButtonSize, delButtonSize); 
    [testButton addTarget:self action:@selector(deleteRecipe:) forControlEvents:UIControlEventTouchUpInside]; 
    testButton.backgroundColor = [UIColor redColor]; 
    [cell.contentView addSubview:testButton]; 
    // ... 
    return cell; 
} 

Dovrebbe mostrare un pulsante con redColor in alto a sinistra nella cella.

Questo codice è solo a scopo di test. Idealmente non si desidera creare una nuova istanza di UIButton per ogni cella. Invece, dove si sta creando la cella in StoryBoard o nel file nib. Aggiungi uno UIButton lì. Quindi iOS può riutilizzare la cella con il pulsante.

Assicurarsi che tutte le viste (eccetto il pulsante Elimina) sulla cella dispongano di una parte superiore sinistra e superiore. Lo spazio a sinistra e in alto farà sì che il pulsante di cancellazione a origin (0, 0) sembri al di fuori dei limiti superiori a sinistra della cella.

Esistono altri modi che implicano la sottoclasse dell'UIButton. Ma quelli possono portare a situazioni difficili. Preferisco riorganizzare le opinioni nella tua sutura.

+0

@deepakKumar answer modificato –

1

io ti do il codice completo di come avrei fatto ciò che si desidera eseguire:

Prima di tutto, creare una sottoclasse di UICollectionViewCell. Chiamiamola CustomCell e assegnagli una proprietà pubblica UIButton chiamata deleteButton. Poi, in CustomCell.m:

#define delButtonSize 60 

// Lazy load the deleteButton 
- (UIButton *)deleteButton 
{ 
    if (!_deleteButton) 
    { 
     _deleteButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, delButtonSize, delButtonSize)]; 
     _deleteButton.center = CGPointMake(9, 10); 
     _deleteButton.backgroundColor = [UIColor clearColor]; 

     [self.contentView addSubview:_deleteButton]; 

     [_deleteButton addTarget:self action:@selector(deleteRecipe) forControlEvents:UIControlEventTouchUpInside]; 
    } 

    return _deleteButton; 
} 

// Here we remove all the custom stuff that we added to our subclassed cell 
- (void) prepareForReuse 
{ 
    [super prepareForReuse]; 

    [self.deleteButton removeFromSuperview]; 
    self.deleteButton = nil; 
} 


- (void) deleteRecipe 
{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"DeleteCell" object:self]; 
} 

Ora nel tuo ViewController, fare questo:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CustomCell *cell = (CustomCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath]; 

    //[cell.deleteButton setImage: [UIImage imageNamed:@"cross_30.png"] forState:UIControlStateNormal]; 
    [cell.deleteButton setBackgroundColor:[UIColor blueColor]]; 
    cell.contentView.backgroundColor = [UIColor redColor]; 

    return cell; 
} 


- (void) deleteCell:(NSNotification *)notification 
{ 
    NSIndexPath *indexPath = [self.collectionView indexPathForCell:(CustomCell *)notification.object]; 
    [self.contentData removeObjectAtIndex:indexPath.row]; 
    [self.collectionView deleteItemsAtIndexPaths:@[indexPath]]; 
} 

ho provato il mio codice, ha funzionato perfettamente sul mio computer. Spero che aiuti!

+0

impossibile mostrare il pulsante Elimina. – Techiee

+0

Non riesco ad aggiungere il pulsante – Techiee

2

uso bringSubviewToFront in UIView:

[cell bringSubviewToFront:_deleteButton]; 

di riferimento: UIView bringSubviewToFront

per ottenere l'effetto nell'angolo in alto a sinistra fuori limite, si dovrebbe seguire la risposta di cellule dell'Islam Q per spostare la cornice della deletebutton al di fuori di il limite della cella e imposta la sottoview della clip della cella su NO.

1

Impostare la center del button per essere {0: 0} e chiedere il cell non tagliare subviews al di là dei suoi confini:

_deleteButton.center = cell.bounds.origin; 
cell.clipsToBounds = NO; 
0

Questo è un pezzo di torta :)

ho afferrato questo source code e inserire il codice di layout in questo modo. La mia soluzione utilizzerà AutoLayout.

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 

    // [...] some code from the source code 
    collectionImageView.layer.cornerRadius = 10; 
    collectionImageView.clipsToBounds = YES; 

    cell.backgroundColor = [UIColor clearColor]; 
    cell.clipsToBounds = NO; // display subviews which will be out of bounds 

    CGFloat deleteButtonSize = 20; 

    UIButton *yourButtonView = [UIButton new]; 
    yourButtonView.backgroundColor = [UIColor redColor]; 
    yourButtonView.layer.cornerRadius = deleteButtonSize/2.0; 
// [yourButtonView addTarget:self action:@selector(deleteRecipe:) forControlEvents:UIControlEventTouchUpInside]; 
    [cell addSubview:yourButtonView]; 

    // setup autolayout constraints 
    [yourButtonView setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    [NSLayoutConstraint constraintWithItem:yourButtonView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:deleteButtonSize].active = YES; 
    [NSLayoutConstraint constraintWithItem:yourButtonView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:deleteButtonSize].active = YES; 

    [NSLayoutConstraint constraintWithItem:yourButtonView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:cell attribute:NSLayoutAttributeLeft multiplier:1 constant:deleteButtonSize * 0.2].active = YES; 
    [NSLayoutConstraint constraintWithItem:yourButtonView attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:cell attribute:NSLayoutAttributeTop multiplier:1 constant:deleteButtonSize * 0.2].active = YES; 
    // deleteButtonSize * 0.2 is the offset here 

    return cell; 
} 

Il risultato assomiglia a questo:

enter image description here

0

io vi suggerisco di progettare la vostra abitudine UICollectionViewCell che è stato progettato di conseguenza e riutilizzare lo stesso con l'identificatore passato.

Problemi correlati