Niedawno przeprowadziłem migrację części kodu do nowego zestawu SDK iOS 11 beta 5.
UITableView zachowuje się teraz bardzo myląco. Sam widok tabeli nie jest taki wyszukany. Mam niestandardowe komórki, ale w większości są to tylko ich wysokość.
Kiedy naciskam kontroler widoku z widokiem tabeli, otrzymuję dodatkową animację, w której komórki „przewijają się w górę” (lub być może cała ramka widoku tabeli jest zmieniana) iw dół wzdłuż animacji nawigacji push / pop. Proszę zobaczyć gif:
Tworzę ręcznie tableview
w loadView
metodzie i ustawiam ograniczenia automatycznego układu, aby były równe wiodącemu, końcowemu, górnemu i dolnemu nadzorowi widoku tabeli. Superview to widok główny kontrolera widoku.
Wyświetl kod wypychania kontrolera jest bardzo standardowy: self.navigationController?.pushViewController(notifVC, animated: true)
Ten sam kod zapewnia normalne zachowanie w systemie iOS 10.
Czy mógłbyś wskazać mi, co jest nie tak?
EDYCJA: Zrobiłem bardzo prosty kontroler widoku tabeli i mogę tam odtworzyć to samo zachowanie. Kod:
class VerySimpleTableViewController : UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
}
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 4
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.textLabel?.text = String(indexPath.row)
cell.accessoryType = .disclosureIndicator
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
let vc = VerySimpleTableViewController.init(style: .grouped)
self.navigationController?.pushViewController(vc, animated: true)
}
}
EDYCJA 2: Udało mi się zawęzić problem do mojego dostosowania UINavigationBar. Mam takie dostosowanie:
rootNavController.navigationBar.setBackgroundImage(createFilledImage(withColor: .white, size: 1), for: .default)
gdzie createFilledImage
tworzy kwadratowy obraz o podanym rozmiarze i kolorze.
Jeśli skomentuję tę linię, wrócę do normalnego zachowania.
Byłbym wdzięczny za wszelkie przemyślenia w tej sprawie.
navigationBar.isTranslucent
nafalse
, inaczej to działa dobrze.Odpowiedzi:
Wynika to z nowej właściwości
UIScrollView's
(UITableView jest podklasą UIScrollview)contentInsetAdjustmentBehavior
, która jest.automatic
domyślnie ustawiona na .Możesz zastąpić to zachowanie następującym fragmentem kodu w viewDidLoad wszystkich kontrolerów, których dotyczy problem:
https://developer.apple.com/documentation/uikit/uiscrollview/2902261-contentinsetadjustmentbehavior
źródło
tableView.contentInsetAdjustmentBehavior
przerywałoby wstawki.contentInsetAdjustmentBehavior
na.never
nie jest dobrym obejściem, ponieważ prawdopodobnie będzie miało inne niepożądane skutki uboczne. Jeśli używasz obejścia, pamiętaj, aby usunąć je dla wersji iOS> = 11.2.Oprócz odpowiedzi Maggy
CEL C
źródło
Możesz edytować to zachowanie jednocześnie w całej aplikacji, używając NSProxy w, na przykład didFinishLaunchingWithOptions:
źródło
Oto, jak udało mi się rozwiązać ten problem, jednocześnie pozwalając iOS 11 na automatyczne ustawianie wstawek . Używam
UITableViewController
.tableView.insetsContentViewsToSafeArea = true
) - To może nie być konieczne, ale tak właśnie zrobiłem.tableView.contentInsetAdjustmentBehavior = .scrollableAxes
) -.always
może również działać, ale nie testowałem.Jeszcze jedna rzecz do wypróbowania, jeśli wszystko inne zawiedzie:
Override
viewSafeAreaInsetsDidChange
UIViewController
, aby widok tabeli wymusił ustawienie wstawek widoku przewijania na wstawki obszaru bezpiecznego. Dzieje się tak w połączeniu z ustawieniem „Nigdy” w odpowiedzi Maggy.Uwaga:
self.tableView
iself.view
powinno być to samo dlaUITableViewController
źródło
Wygląda to bardziej na błąd niż zamierzone zachowanie. Dzieje się tak, gdy pasek nawigacji nie jest półprzezroczysty lub gdy ustawiony jest obraz tła.
Jeśli ustawisz contentInsetAdjustmentBehavior na .never, wstawki zawartości nie będą ustawione poprawnie na iPhonie X, np. Zawartość trafi do dolnego obszaru, pod paskiem przewijania.
Konieczne jest zrobienie dwóch rzeczy:
1. zapobieganie animacji
scrollView w trybie push / pop 2. zachowanie zachowania .automatic, ponieważ jest to potrzebne dla iPhone'a X. Bez tego, np. W orientacji pionowej, zawartość znajdzie się poniżej dolnego paska przewijania.
Nowe proste rozwiązanie: w XIB: Po prostu dodaj nowy widok UIView na górze głównego widoku z górą, początkiem i końcem do superviewu i wysokością ustawioną na 0. Nie musisz łączyć go z innymi podglądami podrzędnymi ani z niczym.
Stare rozwiązanie:
Uwaga: Jeśli używasz UIScrollView w trybie poziomym, nadal nie ustawia on poprawnie poziomych wstawek (kolejny błąd?), Więc musisz przypiąć początkowe / końcowe scrollView do safeAreaInsets w IB.
Uwaga 2: Poniższe rozwiązanie ma również problem z tym, że jeśli tableView jest przewijane do dołu, a naciśniesz kontroler i wyskakujesz z powrotem, nie będzie już na dole.
źródło
Mogę odtworzyć błąd w iOS 11.1, ale wygląda na to, że błąd został naprawiony od iOS 11.2. Zobacz http://openradar.appspot.com/34465226
źródło
upewnij się, że wraz z powyższym kodem dodaj dodatkowy kod w następujący sposób. To rozwiązało problem
źródło
Również jeśli używasz paska kart, dolna wstawka zawartości widoku kolekcji będzie wynosić zero. W tym celu umieść poniższy kod w viewDidAppear:
źródło
W moim przypadku to zadziałało (umieść to w viewDidLoad):
źródło
Usuwanie dodatkowej przestrzeni na górze
collectionView
lubtableView
Powyżej kodu
collectionView
lubtableView
poniżej paska nawigacji.Poniższy kod uniemożliwia przejście widoku kolekcji pod nawigację
ale uwielbiam używać poniższej logiki i kodu dla UICollectionView
Najlepszy sposób na UICollectionView
źródło
Usuń ten kod działa dla mnie
źródło
Używałem UISearchController z niestandardowymi wynikamiControllers, które mają widok tabeli. Wciśnięcie nowego kontrolera na kontroler wyników spowodowało przejście widoku tabeli do wyszukiwania.
Kod wymieniony powyżej całkowicie rozwiązał problem
źródło