Próbuję dostosować wysokość komórki dla jednej z komórek w moim widoku tabeli. Dostosowuję rozmiar z ustawienia „wysokości wiersza” w „inspektorze wielkości” danej komórki. Po uruchomieniu aplikacji na iPhonie komórka ma domyślny rozmiar ustawiony na podstawie „rozmiaru wiersza” w widoku tabeli.
Jeśli zmienię „rozmiar wiersza” widoku tabeli, wówczas zmieni się rozmiar wszystkich komórek. Nie chcę tego robić, ponieważ chcę niestandardowy rozmiar tylko dla jednej komórki. Widziałem wiele postów, które mają programowe rozwiązanie problemu, ale wolałbym to zrobić za pomocą scenorysu, jeśli to możliwe.
źródło
UITableView
treść odDynamic Prototypes
celuStatic Cells
, zrobiłem to, a cały mój projekt wysadzili .. prawie zginął siebie.Jeśli używasz UITableViewController, zaimplementuj tę metodę:
W funkcji wiersza możesz wybrać Wysokość. Na przykład,
W tym przykładzie wysokość pierwszego rzędu wynosi 100 pikseli, a pozostałe 60 pikseli.
Mam nadzieję, że ten może ci pomóc.
źródło
W przypadku komórek dynamicznych
rowHeight
ustawienieUITableView
zawsze zastępuje poszczególne komórkirowHeight
.Takie zachowanie jest, IMO, błędem. Za każdym razem, gdy musisz zarządzać interfejsem użytkownika w dwóch miejscach, jest on podatny na błędy. Na przykład, jeśli zmienisz rozmiar komórki w serii ujęć, musisz pamiętać, aby również je zmienić
heightForRowAtIndexPath:
. Dopóki Apple nie naprawi błędu, obecnie najlepszym obejściem jest przesłonięcieheightForRowAtIndexPath:
, ale użyj rzeczywistych prototypowych komórek z serii ujęć, aby określić wysokość, zamiast używać liczb magicznych . Oto przykład:Zapewni to, że wszelkie zmiany wysokości prototypowych komórek zostaną automatycznie wykryte w czasie wykonywania, a użytkownik będzie musiał zarządzać interfejsem użytkownika tylko w jednym miejscu: w scenariuszu.
źródło
Zbudowałem kod, na który wskazują różne odpowiedzi / komentarze, aby działało to w przypadku scenorysów wykorzystujących komórki prototypowe.
Ten kod:
Dzięki Answerbot, Brennan i lensovet.
źródło
W rzeczywistości są dwa miejsca, w których musisz zmienić wysokość wiersza, najpierw komórka (już to zmieniłeś), a teraz wybierz Widok tabeli i sprawdź Inspektor rozmiaru
źródło
Myślę, że to błąd.
Spróbuj wyregulować wysokość nie za pomocą Inspektora narzędzi, ale przeciągając myszą bezpośrednio na scenorysie.
Rozwiązałem ten problem za pomocą tej metody.
źródło
Jeśli używasz szybkiego, użyj tego w ten sposób. Nie używaj scenorysu, aby wybrać wysokość wiersza. Programowo ustawiaj wysokość wiersza tabeli w ten sposób,
źródło
cell.sizeToFit(); self.tableView.rowHeight = cell.frame.height
Możesz uzyskać wysokość UITableviewCell (w UITableviewController - komórki statyczne) z serii ujęć za pomocą następujących wierszy.
źródło
Otwórz scenorys w widoku XML i spróbuj edytować
rowHeight
atrybut pożądanego elementu.Działa to dla mnie, gdy próbowałem ustawić niestandardową wysokość wiersza dla mojego prototypowanego wiersza. Nie działa przez inspektora, ale działa przez XML.
źródło
Możesz użyć prototypu
cells
z niestandardowymheight
, a następnie wywołaćcellForRowAtIndexPath:
i zwrócić jegoframe.height
.:.źródło
Jeśli chcesz ustawić statyczną wysokość wiersza, możesz zrobić coś takiego:
źródło
Ostatnio walczyłem z tym. Mój problem polegał na tym, że powyższe rozwiązania wykorzystujące tę
heightForRowAtIndexPath:
metodę działałyby na iOS 7.1 w Symulatorze, ale potem całkowicie spieprzyły wyniki, po prostu przechodząc na iOS 8.1.Zacząłem czytać więcej o samorozmierzających się komórkach (wprowadzonych w iOS 8, czytaj tutaj ). Było oczywiste, że użycie
UITableViewAutomaticDimension
pomoże w iOS 8. Próbowałem użyć tej techniki i usunąłem użycieheightForRowAtIndexPath:
i voila, teraz działało idealnie w iOS 8. Ale potem iOS 7 nie był. Co miałam zrobić? PotrzebowałemheightForRowAtIndexPath:
na iOS 7, a nie na iOS 8.Oto moje rozwiązanie (przygotowane dla zwięzłości), które pożyczyłem od odpowiedzi @JosephH zamieszczonej powyżej:
SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO (@ „8.0”) jest właściwie z zestawu definicji makr, których używam, które gdzieś znalazłem (bardzo pomocne). Są one zdefiniowane jako:
źródło
Ten sam problem wystąpił podczas pracy na XCode 9 za pomocą Swift 4 .
Dodaj opcję AutoLayout dla elementów interfejsu użytkownika w komórce, a niestandardowa wysokość wiersza komórki będzie działać odpowiednio, jak określono.
źródło
W przypadku komórek dynamicznych wartość rowHeight ustawiona w UITableView zawsze zastępuje wartość rowHeight poszczególnych komórek. Wystarczy obliczyć wysokość dynamiczną, jeśli zawartość wewnątrz wiersza.
źródło
Jedynym prawdziwym rozwiązaniem, jakie mogłem znaleźć, jest to
To działa i pozwala nie mieć okropnego przełącznika / jeśli powiela logikę już na StoryBoard. Nie jestem pewien co do wydajności, ale myślę, że po przybyciu
cellForRow:
do już zainicjowanej komórki jest tak szybko. Oczywiście są tu prawdopodobnie szkody dodatkowe, ale wygląda na to, że działa mi to dobrze.Opublikowałem to również tutaj: https://devforums.apple.com/message/772464
EDYCJA: Ortwin Gentz przypomniał mi, że
heightForRowAtIndexPath:
będą wywoływane dla wszystkich komórek TableView, nie tylko widocznych. Brzmi logicznie, ponieważ iOS musi znać całkowitą wysokość, aby móc wyświetlić odpowiednie paski przewijania. Oznacza to, że prawdopodobnie jest w porządku na małych TableViews (jak 20 komórek), ale zapomnij o tym na 1000 TableView.Również poprzednia sztuczka z XML: tak samo jak pierwszy komentarz dla mnie. Prawidłowa wartość już tam była.
źródło
Dodano jako komentarz, ale opublikowanie jako odpowiedź na widoczność:
Wydaje się również występować problem, jeśli początkowo skonfigurujesz widok tabeli jako „komórki statyczne”, a następnie zmienisz go na „dynamiczne prototypy”. Miałem problem polegający na
heightForRowAtIndexPath
tym, że nawet metoda delegowania była ignorowana. Najpierw rozwiązałem go, edytując bezpośrednio scenariuszowy kod XML, a na koniec po prostu przebudowałem scenę od podstaw, używając dynamicznych prototypów od samego początku.źródło
Biorąc pod uwagę, że nie znalazłem żadnego rozwiązania tego problemu za pomocą Konstruktora interfejsów, postanowiłem opublikować programowe rozwiązanie problemu w Swift przy użyciu dwóch dynamicznych komórek , mimo że początkowe pytanie dotyczyło rozwiązania za pomocą Konstruktora interfejsów. Niezależnie od tego uważam, że może to być pomocne dla społeczności Stack Overflow:
źródło
Inną rzeczą, którą możesz zrobić, to przejść do Zarysu dokumentu, wybrać widok tabeli, w którym zagnieżdżona jest komórka prototypowa. Następnie w Inspektorze rozmiarów zmień widok tabeli Wysokość wiersza na żądaną wartość i odznacz pole Automatyczne.
źródło