Obecnie używam UICollectionView
siatki interfejsu użytkownika i działa dobrze. Chciałbym jednak włączyć przewijanie w poziomie. Siatka obsługuje 8 elementów na stronę, a gdy łączna liczba elementów wynosi, powiedzmy 4, w ten sposób należy rozmieścić elementy z włączonym kierunkiem przewijania w poziomie:
0 0 x x
0 0 x x
Tutaj 0 -> Element kolekcji i x -> Puste komórki
Czy istnieje sposób na wyrównanie ich do środka, na przykład:
x 0 0 x
x 0 0 x
Żeby treść wyglądała na bardziej przejrzystą?
Również poniższy układ może być rozwiązaniem, którego oczekuję.
0 0 0 0
x x x x
minimumInteritemSpacing
wskazuje tylko ich minimum.return UIEdgeInsetsMake(0, 100, 0, 100);
. Jeśli jest dodatkowe miejsce, widok kolekcji rozszerzy tymczasowe odstępy, więc musisz upewnić się, że LeftInset + CellWidth * Ncells + CellSpacing * (Ncells-1) + RightInset = CollectionViewWidthDla tych, którzy szukają rozwiązania dla wyrównanych do środka komórek widoku kolekcji o dynamicznej szerokości , tak jak ja, zmodyfikowałem odpowiedź Anioła na wersję wyrównaną do lewej, aby utworzyć wyśrodkowaną podklasę dla
UICollectionViewFlowLayout
.CenterAlignedCollectionViewFlowLayout
źródło
guard let superArray = super.layoutAttributesForElementsInRect(rect) else { return nil } guard let attributes = NSArray(array: superArray, copyItems: true) as? [UICollectionViewLayoutAttributes] else { return nil }
interItemSpacing
aby użyć domyślnegominimumInteritemSpacing
.Najlepsze rozwiązania tutaj nie działały dla mnie od razu po wyjęciu z pudełka, więc wymyśliłem to, które powinno działać dla każdego widoku kolekcji z przewijaniem poziomym z układem przepływu i tylko jedną sekcją:
źródło
Łatwo jest dynamicznie obliczyć wstawki, ten kod zawsze wyśrodkuje komórki:
źródło
Podobnie jak inne odpowiedzi, jest to odpowiedź dynamiczna, która powinna działać w przypadku komórek o statycznym rozmiarze. Jedyną modyfikacją, którą wprowadziłem, jest to, że położyłem wyściółkę po obu stronach. Jeśli tego nie zrobiłem, miałem problemy.
Cel C
Szybki
Ponadto, jeśli nadal występują problemy, upewnij się, że można ustawić zarówno
minimumInteritemSpacing
iminimumLineSpacing
do tych samych wartości, ponieważ wartości te wydają się być ze sobą powiązane.źródło
Umieść to w delegacie widoku kolekcji. Uwzględnia więcej podstawowych ustawień układu przepływu niż inne odpowiedzi i dlatego jest bardziej ogólny.
szybka wersja (dzięki g0ld2k):
źródło
totalCellWidth
powinnocellWidth*cellCount + spacing*(cellCount-1)
.Moje rozwiązanie dla komórek widoku kolekcji o statycznym rozmiarze, które muszą mieć dopełnienie po lewej i prawej stronie
źródło
Mam pasek tagów w mojej aplikacji, który używa znaku
UICollectionView
&UICollectionViewFlowLayout
, z jednym wierszem komórek wyrównanym do środka.Aby uzyskać prawidłowe wcięcie, odejmujesz całkowitą szerokość wszystkich komórek (w tym odstępy) od szerokości swojego
UICollectionView
i dzielisz przez dwa.Problem w tej funkcji -
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section;
nazywa się przed ...
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;
... więc nie możesz iterować po komórkach, aby określić całkowitą szerokość.
Zamiast tego musisz ponownie obliczyć szerokość każdej komórki, w moim przypadku używam,
[NSString sizeWithFont: ... ]
ponieważ szerokości moich komórek są określane przez sam UILabel.źródło
interSpacing
?interSpacing
jest po prostu stałą w moim kodzie, która określa przestrzeń, którą mam między UICollectionViewCellsW Swift poniższe rozłożą komórki równomiernie, stosując odpowiednią ilość wypełnienia po bokach każdej komórki. Oczywiście najpierw musisz znać / ustawić szerokość komórki.
źródło
Swift 2.0 U mnie działa dobrze!
Gdzie: screenWight : w zasadzie jest to szerokość mojej kolekcji (pełna szerokość ekranu) - stworzyłem stałe: niech screenWight: CGFloat = UIScreen.mainScreen (). Bounds.width, ponieważ self.view.bounds pokazuje za każdym razem 600 - coz elementów SizeClasses - tablica komórek 50 - moja ręczna szerokość komórki 10 - moja odległość między komórkami
źródło
Możesz użyć https://github.com/keighl/KTCenterFlowLayout w ten sposób:
źródło
Nie jestem pewien, czy to jest nowe w Xcode 5, czy nie, ale możesz teraz otworzyć Inspektor rozmiaru za pomocą Interface Builder i ustawić tam wstawkę. Zapobiegnie to konieczności pisania niestandardowego kodu, aby zrobić to za Ciebie, i powinno drastycznie zwiększyć prędkość, z jaką znajdujesz odpowiednie przesunięcia.
źródło
Innym sposobem na to jest ustawienie
collectionView.center.x
, na przykład:W tym przypadku szanując tylko właściwą wstawkę, która działa dla mnie.
źródło
Na podstawie odpowiedzi użytkownika3676011 mogę zasugerować bardziej szczegółową z niewielką poprawką. To rozwiązanie działa świetnie w Swift 2.0 .
Wystąpił problem w programie
gdzie należy dodatkowo
-1
wspomnieć.źródło
W ten sposób otrzymałem widok kolekcji, który był wyśrodkowany ze stałym odstępem między elementami
źródło
Robocza wersja odpowiedzi kgaidis na cel C przy użyciu Swift 3.0:
źródło
Oto moje rozwiązanie z kilkoma założeniami:
Zapraszam do dostosowania do swoich potrzeb.
Układ wyśrodkowany ze zmienną szerokością komórki:
Wynik:
źródło
Oto, jak możesz to zrobić i działa dobrze
źródło