Ich habe kürzlich Code auf das neue iOS 11 Beta 5 SDK migriert.
Ich bekomme jetzt ein sehr verwirrendes Verhalten von UITableView. Die Tabellenansicht selbst ist nicht so schick. Ich habe benutzerdefinierte Zellen, aber zum größten Teil ist es nur für ihre Höhe.
Wenn ich meinen Ansichts-Controller mit Tabellenansicht drücke, erhalte ich eine zusätzliche Animation, in der Zellen entlang der Push / Pop-Navigationsanimation "nach oben scrollen" (oder möglicherweise der gesamte Rahmen der Tabellenansicht geändert wird) und nach unten. Bitte siehe gif:
Ich erstelle manuell tableview
in loadView
Methode und richte Einschränkungen für das automatische Layout so ein, dass sie der führenden, nachfolgenden, oberen und unteren Seite der Übersicht der Tabellenansicht entsprechen. Die Übersicht ist die Stammansicht des View Controllers.
Der Push-Code des View Controllers ist Standard: self.navigationController?.pushViewController(notifVC, animated: true)
Der gleiche Code bietet unter iOS 10 ein normales Verhalten.
Könnten Sie mich bitte darauf hinweisen, was falsch ist?
EDIT: Ich habe einen sehr einfachen Tableview-Controller erstellt und kann dort das gleiche Verhalten reproduzieren. Code:
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)
}
}
EDIT 2: Ich konnte das Problem auf meine Anpassung von UINavigationBar eingrenzen. Ich habe eine Anpassung wie diese:
rootNavController.navigationBar.setBackgroundImage(createFilledImage(withColor: .white, size: 1), for: .default)
Dabei createFilledImage
wird ein quadratisches Bild mit der angegebenen Größe und Farbe erstellt.
Wenn ich diese Zeile auskommentiere, bekomme ich wieder normales Verhalten.
Ich würde mich über Gedanken zu diesem Thema freuen.
navigationBar.isTranslucent
habefalse
, sonst funktioniert es einwandfrei.Antworten:
Dies liegt an
UIScrollView's
der neuencontentInsetAdjustmentBehavior
Eigenschaft (UITableView ist eine Unterklasse von UIScrollview) , die.automatic
standardmäßig festgelegt ist.Sie können dieses Verhalten mit dem folgenden Snippet in viewDidLoad aller betroffenen Controller überschreiben:
https://developer.apple.com/documentation/uikit/uiscrollview/2902261-contentinsetadjustmentbehavior
quelle
tableView.contentInsetAdjustmentBehavior
beschädigt.contentInsetAdjustmentBehavior
auf.never
ist keine gute Problemumgehung, da es wahrscheinlich andere unerwünschte Nebenwirkungen hat. Wenn Sie eine Problemumgehung verwenden, sollten Sie diese für iOS-Versionen> = 11.2 entfernen.Neben Maggys Antwort
ZIEL C
quelle
Sie können dieses Verhalten in der gesamten Anwendung sofort bearbeiten, indem Sie NSProxy verwenden, z. B. didFinishLaunchingWithOptions:
quelle
So konnte ich dieses Problem beheben, während iOS 11 weiterhin automatisch Einfügungen festlegen konnte . Ich benutze
UITableViewController
.tableView.insetsContentViewsToSafeArea = true
) - Das ist vielleicht nicht nötig, aber ich habe es getan.tableView.contentInsetAdjustmentBehavior = .scrollableAxes
) -.always
funktioniert möglicherweise auch, aber ich habe es nicht getestet.Eine andere Sache zu versuchen, wenn alles andere fehlschlägt:
Überschreiben Sie die
viewSafeAreaInsetsDidChange
UIViewController
Methode, um die Tabellenansicht zu zwingen, das Setzen der Bildlaufansicht-Einfügungen auf die Sicherheitsbereichseinfügungen zu erzwingen. Dies steht in Verbindung mit der Einstellung "Nie" in Maggys Antwort.Hinweis:
self.tableView
undself.view
sollte das gleiche sein fürUITableViewController
quelle
Dies scheint eher ein Fehler als ein beabsichtigtes Verhalten zu sein. Dies geschieht, wenn die Navigationsleiste nicht durchscheinend ist oder wenn das Hintergrundbild eingestellt ist.
Wenn Sie nur contentInsetAdjustmentBehavior auf .never setzen, werden Inhaltseinfügungen auf dem iPhone X nicht richtig eingestellt, z. B. wird der Inhalt unter den Bildlaufleisten in den unteren Bereich verschoben.
Es müssen zwei Dinge getan werden:
1. Verhindern, dass scrollView bei Push / Pop animiert wird.
2. Automatisches Verhalten beibehalten, da es für das iPhone X benötigt wird. Ohne dies, z. B. im Hochformat, wird der Inhalt unter die untere Bildlaufleiste verschoben.
Neue einfache Lösung: In XIB: Fügen Sie einfach eine neue UIView über Ihrer Hauptansicht hinzu, wobei oben, oben und unten die Übersicht und die Höhe auf 0 gesetzt sind. Sie müssen sie nicht mit anderen Unteransichten oder Ähnlichem verbinden.
Alte Lösung:
Hinweis: Wenn Sie UIScrollView im Querformat verwenden, werden horizontale Einfügungen immer noch nicht richtig eingestellt (ein weiterer Fehler?). Daher müssen Sie die führenden / nachfolgenden Zeichenfolgen von scrollView an safeAreaInsets in IB anheften.
Hinweis 2: Die folgende Lösung hat auch das Problem, dass tableView, wenn es nach unten gescrollt wird und Sie den Controller drücken und zurückspringen, nicht mehr unten angezeigt wird.
quelle
Ich kann den Fehler für iOS 11.1 reproduzieren, aber es scheint, dass der Fehler seit iOS 11.2 behoben ist. Siehe http://openradar.appspot.com/34465226
quelle
Bitte stellen Sie sicher, dass Sie zusammen mit dem obigen Code zusätzlichen Code wie folgt hinzufügen. Es hat das Problem gelöst
quelle
Wenn Sie die Registerkartenleiste verwenden, ist der untere Inhalt der Sammlungsansicht Null. Fügen Sie dazu den folgenden Code in viewDidAppear ein:
quelle
In meinem Fall hat dies funktioniert (in viewDidLoad einfügen):
quelle
Entfernen von zusätzlichem Platz oben auf
collectionView
odertableView
Über dem Code
collectionView
odertableView
unter der Navigationsleiste.Der folgende Code verhindert, dass die Sammlungsansicht unter der Navigation angezeigt wird
Aber ich liebe es, unten Logik und Code für die UICollectionView zu verwenden
Der beste Weg für UICollectionView
quelle
Löschen Sie diese Code-Arbeit für mich
quelle
Ich habe UISearchController mit benutzerdefinierten resultsControllern mit Tabellenansicht verwendet. Durch Drücken des neuen Controllers auf den Ergebnis-Controller wurde die Tabellenansicht durchsucht.
Der oben aufgeführte Code hat das Problem vollständig behoben
quelle