2013-04-17 6 views
24

In meiner iPhone App zeige ich Bilder auf einer Sammlungsansicht. Ich hole die Bilder von URLs, mit URLs bekomme ich auch die Bildgröße. zB: - lassen Sie uns sagen, es gibt zwei Arten von Bildern Querformat und Hochformat. Ich bekomme Wert P für Hochformatbilder und L für QuerformatbilderUnterschiedliche Zellengröße in UICollectionview

Wie die collectionView Zelle Größe anpassen?

+0

Sie https://github.com/bryceredd/RFQuiltLayout. Sieht aus wie etwas, das Sie für dieses – Rajneesh071

Antwort

63

verwenden UICollectionViewDelegateFlowLayout Methode

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath; 
+0

verwenden können Danke. Ich steckte hier fest und eröffnete ein neues Projekt zum Testen und Arbeiten. –

+1

PS. UICollectionViewDelegateFlowLayout enthält sowohl UICollectionViewDataSource als auch UICollectionViewDelegate, sodass Sie Ihren Delegatendeklarationen nur hinzufügen müssen. –

9

1) könnten Sie pflegen und tauschen mehrere Layout-Objekte, aber es gibt einen einfacheren Weg. Folgendes Ihre UICollectionViewController Unterklasse nur hinzufügen und die Größen nach Bedarf anpassen:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
{  
    // Adjust cell size for orientation 
    if (UIDeviceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) { 
     return CGSizeMake(170.f, 170.f); 
    } 
    return CGSizeMake(192.f, 192.f); 
} 

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
{ 
    [self.collectionView performBatchUpdates:nil completion:nil]; 
} 

Aufruf -performBatchUpdates:completion: wird das Layout ungültig und die Zellen mit Animation die Größe (die Sie gerade null an beide Block params passieren kann, wenn man keine zusätzliche haben Anpassungen durchzuführen).

2) Statt die Artikelgrößen in -collectionView:layout:sizeForItemAtIndexPath fest zu codieren, teilen Sie einfach die Höhe oder Breite der collectionView-Grenzen durch die Anzahl der Zellen, die Sie auf den Bildschirm anpassen möchten. Verwenden Sie die Höhe, wenn Ihre UICollectionView horizontal scrollt oder die Breite, wenn sie vertikal scrollt.

2

Das habe ich gemacht. Zuerst stelle ich die Größe der Zelle basierend auf der Größe des Bildschirms ein (so dass wir die beste Anzahl von Bildern in jeder Zeile erhalten). Vielleicht möchten Sie die Zahlen ändern, um Ihrer Ursache gerecht zu werden.

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{ 
CGFloat widthOfCell =(self.view.frame.size.width-30)/2; 
CGFloat heightOfCell =widthOfCell * 1.33; 
CGSize returnValue = CGSizeMake(widthOfCell, heightOfCell); 
returnValue.height += 5; 
returnValue.width += 5; 
return returnValue; 

} 

habe ich dann ein Bildbearbeitungsverfahren, die Landschaft oder Portrait-Zustand und (für meine app), um zu bestimmen ich jedes Bild ein Porträt zu machen beschlossen:

if (sourceImage.size.width>sourceImage.size.height) { 
    sourceImage = [[UIImage alloc] initWithCGImage: sourceImage.CGImage 
              scale: 1.0 
             orientation: UIImageOrientationRight]; 
    } 

Wenn Sie es haben wollen umgekehrt, tauschen Sie die > mit <

CAVEAT: meine rotierende Methode berücksichtigt nicht, wenn das Bild nach links oder rechts zeigt. Mit anderen Worten, wenn ein Bild auf dem Kopf steht, kann mein Code das nicht erkennen. Ich hoffe, dass jemand anderes Ihnen helfen kann, und ich hoffe, ich bin nicht vom Weg abgekommen! :)

1

Für rasche Verlängerung der Flow Sie Viewcontroller, wenn Sie die dynamische Bilder auf Zelle machen Variable zeigen, müssen die Bilder in Ihre Ansicht contorller Namen halten und verwenden Sie diese:

let imageData = ["image1","image2","image3","image4"] 

extension yourViewController: UICollectionViewDataSource,UICollectionViewDelegate,UICollectionViewDelegateFlowLayout{ 
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 

    let photo = UIImage(named: imageData[indexPath.row]) 
     return CGSize(width: (photo?.size.width)!, height: (photo?.size.height)!) 

} 

}