2014-01-31 6 views
10

Ich arbeite mit UICollectionView, wo ich alle Bilder aus der Fotobibliothek des Telefons anzeigen.Bilder in UICollectionView spiegeln sich automatisch, wenn Sie nach unten scrollen?

Wenn ich auf eines der Bilder klicke, wird das Bild umgedreht und einige Informationen zum Bild werden angezeigt.

Wenn der Benutzer erneut auf dasselbe Bild klickt, wird das Bild erneut gedreht und das Originalbild wird angezeigt.

Das Problem ist, dass, wenn ich durch die UICollectionView nach unten scrollen, das zuletzt ausgewählte Bild automatisch umklappt und die Informationen über das Bild angezeigt werden.

Wie Sie dieses Problem stoppen. Hier

ist ein Code:

- (void) collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 
    { 
     UICollectionViewCell *cell1 = [collectionView cellForItemAtIndexPath:indexPath]; 
     if(old_path!=NULL){ 
     UICollectionViewCell *cell2 = [collectionView cellForItemAtIndexPath:old_path]; 
     [UIView transitionFromView:cell2.selectedBackgroundView toView:cell2.contentView duration:0.5 options:UIViewAnimationOptionCurveLinear |UIViewAnimationOptionTransitionFlipFromLeft completion:nil]; 

    } 
if(old_path==indexPath&&flag) 
{ 
    [cell1 setSelected:NO]; 
    [UIView transitionFromView:cell1.selectedBackgroundView toView:cell1.contentView duration:0.5 options:UIViewAnimationOptionCurveLinear |UIViewAnimationOptionTransitionFlipFromLeft completion:nil]; 
    flag=FALSE; 
} 
else{ 
    [UIView transitionFromView:cell1.contentView toView:cell1.selectedBackgroundView duration:0.5 options:UIViewAnimationOptionCurveLinear |UIViewAnimationOptionTransitionFlipFromLeft completion:nil]; 
    flag=TRUE; 
} 
old_path=indexPath; 
} 
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UICollectionViewCell *cell=[collectionView dequeueReusableCellWithReuseIdentifier:@"cellIdentifier" forIndexPath:indexPath]; 
    ALAsset *asset = assets[indexPath.row]; 
    NSLog(@"Description : %@",[asset description]); 
    UIImage *img=[self imageWithImage:[UIImage imageWithCGImage:[asset thumbnail]] convertToSize:CGSizeMake(150, 150)]; 
    UIView *contents = [[UIView alloc]initWithFrame:cell.bounds]; 
    contents.backgroundColor = [UIColor colorWithPatternImage:img]; 

    [cell.contentView addSubview:contents]; 

    UIView *backgroundView = [[UIView alloc]initWithFrame:cell.bounds]; 
    backgroundView.backgroundColor = [UIColor yellowColor]; 
    UIButton *del=[UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    del.frame= CGRectMake(backgroundView.frame.origin.x+20,  backgroundView.frame.origin.y+20, 100, 40); 
    [del setTitle:@"Delete" forState:UIControlStateNormal]; 
    [del addTarget:self action:@selector(delete) forControlEvents:UIControlEventTouchUpInside]; 
    [backgroundView addSubview:del]; 
    UIButton *cancel=[UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    cancel.frame= CGRectMake(backgroundView.frame.origin.x+20, backgroundView.frame.origin.y+80, 100, 45); 
    [cancel setTitle:@"Cancel" forState:UIControlStateNormal]; 
    [cancel addTarget:self action:@selector(cancel) forControlEvents:UIControlEventTouchUpInside]; 
    [backgroundView addSubview:cancel]; 

    cell.selectedBackgroundView = backgroundView; 
    [cell bringSubviewToFront:cell.selectedBackgroundView]; 
    return cell; 
} 

Hier old_path enthält den Index des zuletzt ausgewählten Bildes.

+1

einige Codes benötigt werden .. wir nicht wissen, was Sie genau tun. – Albara

+1

Code für * cellForItemAtIndexPath hinzufügen: * Methode, damit wir wissen, wie Sie Zellen zeichnen. –

Antwort

1

Das Hauptproblem ist wahrscheinlich mit den UIView Übergang Methoden:

[UIView transitionFromView:cell1.selectedBackgroundView toView:cell1.contentView duration:0.5 options:UIViewAnimationOptionCurveLinear |UIViewAnimationOptionTransitionFlipFromLeft completion:nil]; 

UICollectionViewCell ‚s contentView und selectedBackgroundView soll nicht mit wie diese verwirrte, da die Zelle ihr Layout verwaltet. Dieser Code entfernt die Inhaltsansicht vollständig und ersetzt sie durch die Hintergrundansicht, die bei Auswahl der Ansicht hinter der Inhaltsansicht liegt und aus der Ansichtshierarchie entfernt wird, wenn sie nicht ausgewählt ist.

Der richtige Weg, um das zu erreichen, was Sie tun (das Bild bei einem Tippen anzeigen/ausblenden), wäre der Übergang zwischen der Bildansicht selbst und einer anderen Unteransicht in der Inhaltsansicht.


könnte es auch etwas in Ihrem Redimensionierung Code sein, der das Bild des Spiegeln, aber es ist schwer für imageWithImage:convertToSize: ohne den Code zu sagen. Es wäre wahrscheinlich effizienter zu sein, dieses Verfahren, um loszuwerden, und etwas tun, wie folgt aus:

UIImageView *imageView = [[UIImageView alloc] initWithFrame:cell.bounds]; 
imageView.contentsMode = UIViewContentModeScaleAspectFill; 
imageView.clipsToBounds = YES; 
imageView.image = [UIImage imageWithCGImage:[asset thumbnail]]; 
[cell.contentsView addSubview:imageView]; 

ein paar andere Beobachtungen:

Sammlung Ansicht Zellen werden wiederverwendet werden, was bedeutet, dass Ihre Implementierung collectionView:cellForItemAtIndexPath: könnte am Ende einen ganzen Stapel von Bildansichten zu einer Zelle hinzufügen, die mehrere Male aus der Warteschlange genommen wurde. Eine bessere Lösung wäre die Unterklasse UICollectionViewCell und die benutzerdefinierten Ansichten in der Methode init hinzuzufügen.

Der Code old_path==indexPath prüft nicht tatsächlich auf Gleichheit zwischen den beiden Indexpfaden, nur wenn die beiden Variablen die gleiche Adresse im Speicher haben. Verwenden Sie stattdessen [oldPath isEqual:indexPath].

0

Sie können keine benutzerdefinierten Animationen in Hintergrundansichten ausführen, ohne explizit Unterklassen zu erstellen und zu verarbeiten. Da die Sammlungsansicht automatisch die selectedBackgroundView nach oben bringt, ist selectedBackgroundView nicht identisch mit backgroundView. Hinzufügen von Apple-Dokumentation als Referenz

// The background view is a subview behind all other views. 
// If selectedBackgroundView is different than backgroundView, it will be placed above the background view and animated in on selection. 

https://developer.apple.com/library/iOs/documentation/UIKit/Reference/UICollectionViewCell_class/Reference/Reference.html

Verwandte Themen