Mam problem ze zmianą rozmiaru tableHeaderView. To proste nie działa.
1) Utwórz UITableView i UIView (100 x 320 pikseli);
2) Ustaw UIView jako tableHeaderView w UITableView;
3) Buduj i ruszaj. Wszystko w porządku.
Teraz chcę zmienić rozmiar tableHeaderView, więc dodaję ten kod w viewDidLoad:
self.tableView.autoresizesSubviews = YES;
self.tableView.tableHeaderView = myHeaderView;
self.tableView.tableFooterView = myFooterView;
CGRect newFrame = self.tableView.tableHeaderView.frame;
newFrame.size.height = newFrame.size.height + 100;
self.tableView.tableHeaderView.frame = newFrame;
Wysokość tableHeaderView powinna mieć wartość 200, ale pojawia się wartość 100.
Jeśli napiszę:
self.tableView.autoresizesSubviews = YES;
CGRect newFrame = myHeaderView.frame;
newFrame.size.height = newFrame.size.height + 100;
myHeaderView.frame = newFrame;
self.tableView.tableHeaderView = myHeaderView;
self.tableView.tableFooterView = myFooterView;
Następnie zaczyna się od 200 wysokości, tak jak chcę. Ale chcę mieć możliwość modyfikowania go w czasie wykonywania.
Próbowałem też tego bez powodzenia:
self.tableView.autoresizesSubviews = YES;
self.tableView.tableHeaderView = myHeaderView;
self.tableView.tableFooterView = myFooterView;
CGRect newFrame = self.tableView.tableHeaderView.frame;
newFrame.size.height = newFrame.size.height + 100;
self.tableView.tableHeaderView.frame = newFrame;
[self.tableView.tableHeaderView setNeedsLayout];
[self.tableView.tableHeaderView setNeedsDisplay];
[self.tableView setNeedsLayout];
[self.tableView setNeedsDisplay];
Chodzi o to: Jak zmienić rozmiar tableHeaderView w czasie wykonywania ???
Czy ktoś może to zrobić?
Dzięki
ja ja
źródło
[tableView recalculateHeaderHeight]
każdym razem powinniśmy wywołać coś takiego .setTableHeaderView:
połączenia z[tableview beginUpdates]
i[tableview endUpdates]
Ta odpowiedź jest stara i najwyraźniej nie działa na iOS 7 i nowszych.
Napotkałem ten sam problem, a także chciałem, aby zmiany były animowane, więc utworzyłem podklasę UIView dla mojego widoku nagłówka i dodałem te metody:
To zasadniczo animuje wszystkie widoki podrzędne UITableView, które nie są tego samego typu klasy, co klasa wywołująca. Na końcu animacji wywołuje setTableHeaderView w superviewie (UITableView) - bez tego zawartość UITableView przeskoczy z powrotem przy następnym przewijaniu przez użytkownika. Jedynym ograniczeniem, które do tej pory znalazłem, jest to, że jeśli użytkownik spróbuje przewinąć UITableView podczas animacji, przewijanie będzie animowane tak, jakby widok nagłówka nie został zmieniony (nic wielkiego, jeśli animacja jest szybki).
źródło
Jeśli chcesz warunkowo animować zmiany, możesz wykonać następujące czynności:
Zwróć uwagę, że animacja jest podwójna:
tableHeaderView
. Odbywa się to za pomocąbeginUpdates
iendUpdates
UIView
bloku animacji.Aby zsynchronizować te dwie animacje
animationCurve
, należy ustawić naUIViewAnimationCurveEaseInOut
i czas trwania0.3
, który wydaje się być tym, czego używa UITableView do swojej animacji.Aktualizacja
Stworzyłem projekt Xcode na gihub, który to robi. Sprawdź projekt
ResizeTableHeaderViewAnimated
w besi / ios-quickiesźródło
Myślę, że powinno działać, jeśli po prostu ustawisz wysokość myHeaderView w następujący sposób:
źródło
Użyto rozwiązania @garrettmoon powyżej do iOS 7.
Oto zaktualizowane rozwiązanie oparte na @ garrettmoon:
źródło
U mnie to zadziałało na iOS 7 i 8. Ten kod działa na kontrolerze widoku tabeli.
źródło
Dzieje się tak, ponieważ ustawiacz tableHeaderView.
Musisz ustawić wysokość UIView przed ustawieniem tableHeaderView. (Byłoby znacznie łatwiej, gdyby Apple otworzył źródła tego frameworka ...)
źródło
W systemie iOS 9 i starszym
tableHeaderView
nie zmieniał układu po zmianie jego rozmiaru. Ten problem został rozwiązany w iOS 10.Aby rozwiązać ten problem, zrób to za pomocą następującego kodu:
źródło
W iOS 9.x robienie tego
viewDidLoad
działa dobrze:headerView
jest zadeklarowany jako@IBOutlet var headerView: UIView!
i połączony w scenorysie, gdzie jest umieszczony w górnej części tableView, aby działał jako tableHeaderView.źródło
Dotyczy to tylko sytuacji, gdy używasz automatycznego układu i ustawisz
translatesAutoresizingMaskIntoConstraints = false
niestandardowy widok nagłówka.Najlepszym i najprostszym sposobem jest nadpisanie
intrinsicContentSize
. WewnętrznieUITableView
używaintrinsicContentSize
do określenia rozmiaru nagłówka / stopki. Po nadpisaniuintrinsicContentSize
w widoku niestandardowym należy wykonać poniższe czynnościinvalidateIntrinsicContentSize()
tableView.setNeedsLayout()
itableView.layoutIfNeeded()
Następnie
UITableView
nagłówek / stopka zostaną zaktualizowane tak, jak chcesz. Nie ma potrzeby ustawiania zerowego widoku ani resetowania.Jedną z rzeczy naprawdę interesujące dla
UITableView.tableHeaderView
lub.tableFooterView
jest to, żeUIStackView
tracą swoją zdolność do zarządzania swoimarrangedSubviews
. Jeśli chcesz użyćUIStackView
jako tableHeaderView lub tableFooterView, trzeba osadzić stackView w sposóbUIView
i zastąpićUIView
„sintrinsicContentSize
.źródło
Dla szybkiego 5 przetestowanego kodu
Uwaga: musisz podać wszystkie ograniczenia widoku podrzędnego z góry, dołu, początku, końca. Więc otrzyma cały wymagany rozmiar.
Źródła zaczerpnięte z: https://useyourloaf.com/blog/variable-height-table-view-header/
źródło
Ustawienie wysokości właściwości widoku nagłówka
tableView.tableHeaderView
w programieviewDidLoad
wydaje się nie działać, wysokość widoku nagłówka nadal nie zmienia się zgodnie z oczekiwaniami.Po wielu próbach walki z tym problemem. Odkryłem, że możesz zmienić wysokość, wywołując widok nagłówka, tworząc logikę wewnątrz
- (void)didMoveToParentViewController:(UIViewController *)parent
metody.Przykładowy kod wyglądałby więc następująco:
źródło
Zauważyłem, że inicjator initWithFrame UIView nie honoruje poprawnie przekazanego przeze mnie polecenia. W związku z tym wykonałem następujące czynności, które działały idealnie:
Zaletą tego jest to, że jest lepiej zawarty w kodzie widoku.
źródło
UIScreen
to zły pomysł, jak ponownie wykorzystasz swój widok?Zaimplementowałem animowaną zmianę wysokości nagłówka stołu, aby rozwinąć się do ogólnego ekranu po dotknięciu. Jednak kod może pomóc w innych przypadkach:
źródło
Nagłówek zmiany rozmiaru UITableView - UISearchBar z paskiem zakresu
Chciałem
UITableView
zUISearchBar
jako nagłówek do stołu więc mam hierarchię, która wygląda następującoMetody UISearchBarDelegate
Jak stwierdzono w innym miejscu, jeśli nie ustawisz tabeliTableViewHeader po jej zmianie, nic się nie stanie.
źródło
Jeśli niestandardowy headerView jest zaprojektowany przy użyciu autolayout i headerView musi zostać zaktualizowany po pobraniu z sieci Web lub podobnym leniwym zadaniu. następnie w iOS-Swift zrobiłem to i zaktualizowałem nagłówek nagłówka za pomocą poniższego kodu:
źródło
Oczywiście Apple powinno już zaimplementować UITableViewAutomaticDimension dla tableHeaderView i tableFooterView ...
Wydaje się, że przy użyciu ograniczeń dotyczących układu działają u mnie następujące elementy:
źródło
Jeśli tableHeaderView jest elementem webView z regulacją zawartości, możesz spróbować:
Przetestowałem to na iOS9 i iOS11, działało dobrze.
źródło
Czy próbowałeś
[self.tableView reloadData]
po zmianie wysokości?źródło
- [UITableView reloadData]
jest przeznaczony tylko do dynamicznych widoków (komórek), a także do sekcji Nagłówki, o których oczywiście myśleliście;)