Zrobiłem kilka badań, ale nie mogłem znaleźć żadnego przykładu kodu, jak wyśrodkować komórki w UICollectionView w poziomie.
zamiast pierwszej komórki, która jest taka X00 , chcę, aby była taka 0X0 . czy jest jakiś sposób, aby to osiągnąć?
EDYTOWAĆ:
wizualizować to, czego chcę:
Potrzebuję, aby wyglądał jak wersja B, gdy istnieje tylko jeden element w CollectionView. Kiedy mam więcej niż jeden element, to powinno być jak wersja A, ale z większą liczbą elementów.
W tej chwili wygląda to jak wersja A, gdy mam tylko 1 element i zastanawiam się, jak mogę sprawić, by wyglądała jak B.
Dzięki za pomoc!
Odpowiedzi:
Używanie biblioteki nie jest dobrym pomysłem, jeśli twoim celem jest tylko to, tj. Wyśrodkowanie wyrównanie.
Lepiej możesz wykonać to proste obliczenie w swojej funkcji collectionViewLayout.
źródło
collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int)
.leftInset
wartość w następujący sposób:let leftInset = max(0.0, (self.collectionView.bounds.width - CGFloat(totalCellWidth + totalSpacingWidth)) / 2)
Swift 5.1
Swift 4.2
Szybki 3
nie zapomnij dodać protokołu
źródło
Wypróbuj to dla Swift 4
Dodaj swoją cellWidth zamiast 165.0
źródło
Używam KTCenterFlowLayout do tego, i to działa świetnie. Jest to niestandardowa podklasa,
UICollectionViewFlowLayout
która wyśrodkowuje komórki tak, jak chcesz. (Uwaga: nie jest to prosta rzecz do rozwiązania przez opublikowanie kodu, dlatego też łączę się z projektem GitHub!)źródło
Wersja odpowiedzi Darshana Patela z obiektywnym C :
źródło
Nieznacznie modyfikując odpowiedź @Safad Funy, to zadziałało dla mnie w najnowszej wersji Swift i iOS. W tym przypadku chciałem, aby szerokość komórek była jedną trzecią rozmiaru widoku kolekcji.
źródło
Możesz użyć tego rozszerzenia (Swift 4).
Można go wyśrodkować komórek, jeśli
collectionView
mająlayout.estimatedItemSize = UICollectionViewFlowLayoutAutomaticSize
.Działa z każdym rozmiarem komórek i działa idealnie, gdy
scrollDirection = .horizontal
Mam nadzieję, że to ci pomoże!
źródło
Swift 4.2 (poziomo i pionowo). To niewielkie ulepszenie kodu Różowej Pantery i wielkie dzięki mu!
Upewnij się, że Twoja klasa jest zgodna z protokołem UICollectionViewDelegateFlowLayout
źródło
Oto nowsza wersja Swift 5, która działa również dobrze, gdy komórki mają więcej niż jeden wiersz:
Upewnij się, że Twoja klasa jest zgodna z
UICollectionViewDelegateFlowLayout
protokołem.źródło
Szybki 4
źródło
Dla osób, które chcą tylko dodać dopełnienie ( góra, lewo, dół, prawo ):
Dodaj protokół
UICollectionViewDelegateFlowLayout
Ten przykład pokazuje dopełnienie po lewej i prawej stronie 40.
źródło
SWIFT 4.2
//
źródło
Możesz wypróbować moje rozwiązanie, działa dobrze,
źródło
Odpowiedź akceptowana jest prawidłowa odpowiedź, ale jeśli
totalCellWidth
jest mniej niżCollectionView
„swidth
, ale tylko w celu ochrony przed tym można zrobić, jak poniżej.źródło
Ten kod powinien wyśrodkować widok kolekcji w poziomie nawet w Swift 4.0 bez żadnych modyfikacji:
Upewnij się, że Twoja klasa jest zgodna z
UICollectionViewDelegateFlowLayout
protokołemźródło
Skończyło się na tym, że przyjąłem tutaj zupełnie inne podejście, o czym myślę, że warto wspomnieć.
Ustawiłem ograniczenie, aby mój widok kolekcji był wyrównany poziomo na środku. Następnie ustawiłem kolejne ograniczenie, które określa szerokość. Utworzyłem punkt sprzedaży dla ograniczenia szerokości w moim viewController, który zawiera widok kolekcji. Następnie, gdy moje źródło danych zostanie zmienione i aktualizuję widok kolekcji, obliczam liczbę komórek i wykonuję (bardzo podobne) obliczenia, aby zresetować szerokość.
let newWidth = (items.count * cellWidth) + (items.count * cellSpacing)
Następnie ustawiam wartość wyjścia ograniczenia
.constant
na wynik obliczeń, a autoukład zajmie się resztą.Może to powodować konflikt z `UICollectionViewDelegateFlowLayout, ale to zadziałało idealnie, aby utworzyć widok kolekcji wyrównany do lewej. Wydaje się, że bez delegata działa tylko wtedy, gdy komórki zajmują większość widoku.
źródło
Ogólne rozwiązanie układu flowlayout, które wyśrodkowuje strony, jeśli są mniejsze niż szerokość, i wyrównuje do lewej, jeśli jest ich więcej
Wersja Swift (przekonwertowana z ObjC)
źródło
Mam podobną sytuację w projekcie i naprawiłem to odsyłając
UPCarouselFlowLayout
Myślę, że to obsługuje
swift 5
wersjęhttps://github.com/ink-spot/UPCarouselFlowLayout/blob/master/UPCarouselFlowLayout/UPCarouselFlowLayout.swift
Przyjrzyj się implementacji kodu w
źródło
Najprostszym sposobem jest ustawienie szacunkowego rozmiaru widoku kolekcji na Brak w scenorysie lub w kodzie
layout.estimatedItemSize = CGSize.zero
źródło
Jeśli w grupie jest miejsce tylko na jedną komórkę, a
leading:
itrailing:
of.flexible(0)
wyśrodkują komórkę w poziomie:źródło
Użyłem tego kodu w projekcie. Wyśrodkowuje collectionView w poziomie i w pionie w obu kierunkach
.horizontal
i.vertical
za pomocą wstawek sekcji. Uwzględnia odstępy i oryginalne wstawki przekroju, jeśli są ustawione. Kod do użycia w delegacie,UICollectionViewDelegateFlowLayout
dzięki czemu mamy dostęp do wszystkich właściwości, które musimy pobrać zeUIcollectionView
scenorysu lub ustawić w scenorysie w celu ponownego wykorzystania.Mam nadzieję, że to komuś pomogło - wyśrodkowuje sekcję, a nie elementy wewnątrz sekcji, po więcej musimy podklasować
UICollectionViewFlowLayout
lubUICollectionViewLayout
jako przykład mozaiki z Apple.źródło
Myślę, że musisz wyśrodkować komórkę, więc zamiast używać collectionView, chciałbym, żeby UITableView był bardzo przydatny. Po prostu użyj UIViewController i umieść dwa UIViews z przodu iz tyłu i umieść
UITableView
w środku Mam nadzieję, że to pomożeźródło