Używam Xcode 6 Beta 3, iOS 8 SDK. Kompiluj docelowy iOS 7.0 przy użyciu języka Swift. Zapoznaj się z moim problemem krok po kroku ze zrzutami ekranu poniżej.
Mam UICollectionView w Storyboard. 1 Prototyp UICollectionViewCell, który zawiera 1 etykietę pośrodku (bez reguły autorezyzacji). Fioletowe tło miało oznaczać contentView, który jest generowany w czasie wykonywania przez Cell. Ten widok zostanie w końcu odpowiednio zmieniony na podstawie mojego UICollectionViewLayoutDelegate, ale nie na iOS 7. Zwróć uwagę, że używam Xcode 6 i problem występuje tylko w iOS 7.
Kiedy tworzę aplikację na iOS 8. Wszystko jest w porządku.
Uwaga: Fioletowy to contentView , niebieski to mój UIButton z zaokrąglonym rogiem.
Jednak w systemie iOS 7 wszystkie widoki podrzędne w komórce nagle zmniejszają się do klatki (0,0,50,50) i nigdy nie są już zgodne z moją regułą autorezyzacji.
Zakładam, że to błąd w iOS 8 SDK lub Swift, a może Xcode?
Aktualizacja 1: Ten problem nadal występuje w oficjalnym Xcode 6.0.1! Najlepszym rozwiązaniem jest to, co sugeruje KoCMoHaBTa poniżej, ustawiając ramkę w cellForItem komórki (musisz jednak podklasować swoją komórkę). Okazało się, że jest to niekompatybilność pomiędzy iOS 8 SDK i iOS 7 (sprawdź odpowiedź ecotax poniżej cytowaną z Apple).
Aktualizacja 2: Wklej ten kod na początku swojego cellForItem i wszystko powinno być w porządku:
/** Xcode 6 on iOS 7 hot fix **/
cell.contentView.frame = cell.bounds;
cell.contentView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
/** End of Xcode 6 on iOS 7 hot fix **/
contentView
zmianę rozmiaru komórki, działa dobrze, aby obejść problem. Wydaje mi się, że w iOS 8 Apple zmieniło coś w sposobie obsługi widoków zawartości komórek podczas tworzenia w Interface Builder (który i tak jest trochę czarną skrzynką). Ale fakt, że zmienia zachowanie podczas kierowania na iOS 7, jest z pewnością błędem.contentView
krawędzie do krawędzi komórki.Odpowiedzi:
contentView jest uszkodzony. Można to również naprawić w awakeFromNib
CelC:
Swift3:
źródło
Napotkałem ten sam problem i poprosiłem Apple DTS o pomoc. Ich odpowiedź brzmiała:
Myślę, że oznacza to, że nie jest to błąd w XCode 6, ale niekompatybilność między SDK iOS 8 a SDK iOS 7, która uderzy cię, jeśli zaktualizujesz Xcode 6, ponieważ automatycznie zacznie korzystać z SDK iOS 8.
Jak skomentowałem wcześniej, obejście Daniel Plamann opisało prace dla mnie. Te opisane przez Igora Palagutę i KoCMoHaBTa wyglądają jednak na prostsze i wydają się mieć sens, dając odpowiedź Apple DTS, więc spróbuję później.
źródło
Napotkałem ten sam problem i mam nadzieję, że Apple naprawi to w następnej wersji Xcode. Tymczasem używam obejścia. W mojej
UICollectionViewCell
podklasie właśnielayoutSubviews
nadpisałem i ręcznie zmieniłem rozmiar contentView na wypadek, gdyby rozmiar był inny niżcollectionViewCell
rozmiar.źródło
[cell layoutIfNeeded];
w cellForItem lub cellForRow?Innym rozwiązaniem jest ustawienie rozmiaru contentView i automatycznej zmiany rozmiaru masek w
-collectionView:cellForItemAtIndexPath:
następujący sposób:Działa to również z Auto Layout, ponieważ maski z automatyczną zmianą rozmiaru są tłumaczone na ograniczenia.
źródło
W Xcode 6.0.1 contentView dla UICollectionViewCell jest uszkodzony dla urządzeń iOS7. Można to również naprawić, dodając odpowiednie ograniczenia do UICollectionViewCell i jego contentView w metodach awakeFromNib lub init.
źródło
Nie będzie to działać poprawnie bez żadnego z innych wspomnianych obejść z powodu błędu w Xcode 6 GM w sposobie, w jaki Xcode kompiluje pliki xib do formatu nib. Chociaż nie mogę powiedzieć ze 100% pewnością, że jest to związane z Xcode i nie ma nic wspólnego ze środowiskiem wykonawczym, jestem bardzo pewien - oto jak mogę to pokazać:
Mam nadzieję, że każdy, kto czyta to pytanie, złoży radar w Apple. Jest to OGROMNY problem i wymaga rozwiązania przed ostatecznym wydaniem Xcode.
Edycja: W świetle posta ecotax chciałem tylko zaktualizować to, aby powiedzieć, że teraz potwierdzono różnice w zachowaniu między budowaniem w iOS 8 a iOS 7, ale nie jest to błąd. Mój hack naprawił problem, ponieważ tworzenie na iOS 7 dodało maskę autorezowania do widoku zawartości potrzebnego do tego, aby ta działała, której Apple już nie dodaje.
źródło
Odpowiedzi w tym poście, nigdy nie zrozumiałem, dlaczego to działa.
Po pierwsze, istnieją dwie „zasady”:
[UIView new]
) WłaściwośćtranslatesAutoresizingMaskIntoConstraints
jest ustawiona naYES
translatesAutoresizingMaskIntoConstraints
ustawioną naNO
Wydaje się, że druga zasada nie ma zastosowania do widoków najwyższego poziomu, dla których nie zdefiniowano ograniczeń. (Np. Widok treści)
Patrząc na komórkę Storyboard, zwróć uwagę, że komórka nie jest
contentView
odsłonięta. Nie „kontrolujemy”contentView
, Apple to robi.Zagłęb się w kod źródłowy scenorysu i zobacz, jak
contentView
zdefiniowana jest komórka:<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
Teraz podglądy komórki (zwróć uwagę na
translatesAutoresizingMaskIntoConstraints="NO"
):<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="NaT-qJ-npL" userLabel="myCustomLabel">
contentView
Nie ma totranslatesAutoresizingMaskIntoConstraints
ustawienieNO
. Ponadto brakuje definicji układu, być może z powodu tego, co powiedział @ecotax .Jeśli spojrzymy na
contentView
, to ma maskę autorezyzacji, ale nie ma jej definicji:<autoresizingMask key="autoresizingMask"/>
Więc są dwa wnioski:
contentView
translatesAutoresizingMaskIntoConstraints
jest ustawiony naYES
.contentView
brakuje definicji układu.To prowadzi nas do dwóch rozwiązań, o których mówiliśmy.
Możesz ustawić autorezalizację masek ręcznie w
awakeFromNib
:Lub można ustawić
contentView
translatesAutoresizingMaskIntoConstraints
abyNO
wawakeFromNib
i definiować ograniczenia w- (void)updateConstraints
.źródło
To jest wersja Swift odpowiedzi @ Igor, która została zaakceptowana i dziękuję za miłą odpowiedź.
Najpierw przejdź do
UICollectionViewCell
podklasy i wklej następujący kod, tak jak jest w klasie.Nawiasem mówiąc, używam Xcode 7.3.1 i Swift 2.3. Rozwiązanie jest testowane na systemie iOS 9.3, który działa bez zarzutu.
Dzięki, mam nadzieję, że to pomogło.
źródło
W swift umieść następujący kod w podklasie komórki widoku kolekcji:
źródło
Zauważyłem, że
contentView
w iOS 8 występują również problemy z dopasowywaniem rozmiaru. Zwykle jest on układany bardzo późno w cyklu, co może powodować tymczasowe konflikty z ograniczeniami. Aby rozwiązać ten problem, dodałem następującą metodę w kategoriiUICollectionViewCell
:Ta metoda powinna zostać wywołana po odkolejkowaniu komórki.
źródło
dequeueReusableCellWithReuseIdentifier:forIndexPath:
.Naprawiłem to:
zobacz: tutaj
źródło
Po prostu upewnij się, że zaznaczyłeś pole wyboru „Autoresize subviews” w końcówce tej komórki widoku kolekcji. Będzie działać dobrze zarówno na iOS 8, jak i iOS 7.
źródło