2013-04-17 8 views
24

W mojej aplikacji na iPhone pokazuję obrazy w widoku kolekcji. Po pobraniu obrazów z adresów URL, z adresami URL, otrzymuję również rozmiar obrazu. np .: - załóżmy, że istnieją dwa rodzaje obrazów: krajobraz i portret. Dostaję wartość P dla zdjęć portretowych i L dla zdjęć poziomychInny rozmiar komórki w widoku UICollectionview

Jak dostosować kolekcję? Rozmiar komórki?

+0

You można sprawdzić https://github.com/bryceredd/RFQuiltLayout. Wygląda na coś, co możesz wykorzystać do tego – Rajneesh071

Odpowiedz

63

Zastosowanie tej metody UICollectionViewDelegateFlowLayout

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

Dziękuję. Utknąłem tutaj i otwieram nowy projekt do testowania i pracy. –

+1

PS. UICollectionViewDelegateFlowLayout zawiera zarówno UICollectionViewDataSource, jak i UICollectionViewDelegate, więc wystarczy dodać do deklaracji delegatów. –

9

1) Można utrzymać i zamienić się wiele obiektów układu, ale jest prostszy sposób. Wystarczy dodać następujące wpisy do UICollectionViewController podklasy i dostosować rozmiary wymagane:

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

Wywołanie -performBatchUpdates:completion: unieważnia układ i rozmiar komórki z animacją (można po prostu przejść zerowe obu params blokowych jeśli masz żadnych dodatkowych korekty do wykonania).

2) Zamiast na stałe kodować elementy w rozmiarze -collectionView:layout:sizeForItemAtIndexPath, po prostu podziel wysokość lub szerokość granic kolekcjiView na liczbę komórek, które chcesz dopasować na ekranie. Użyj wysokości, jeśli Twój UICollectionView przewija poziomo lub szerokość, jeśli przewija się w pionie.

2

Oto, co zrobiłem. Najpierw ustawiłem rozmiar komórki na podstawie rozmiaru ekranu (abyśmy mogli uzyskać najlepszą liczbę obrazów w każdym wierszu). Możesz zmienić liczby w zależności od przyczyny.

-(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; 

} 

I następnie wykorzystywane metody manipulacji obrazu w celu określenia poziomą lub pionową stanu, oraz (dla mojej aplikacji) postanowiłem zrobić każdy obraz portret:

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

Jeśli chcesz go mieć w drugą stronę zamień z z < CAVEAT: moja metoda obracania nie bierze pod uwagę, jeśli obraz jest skierowany w lewo lub w prawo. Innymi słowy, jeśli obraz jest krajobrazem do góry nogami, mój kod nie może tego rozpoznać. Mam nadzieję, że ktoś inny może ci pomóc, i mam nadzieję, że nie poszedłem na marne! :)

1

do szybkiego rozszerzenia FlowLayout do ty viewcontroller, jeśli trzeba pokazać dynamiczne obrazy na komórkę uczynić zmienną które posiadają zdjęcia wymienić w swoim widokiem contorller i użyć tego:

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

} 

}