Ich habe eine UIScrollView (eigentlich eine UICollectionView, aber das spielt wahrscheinlich keine Rolle). Wenn es in IOS 7 angezeigt wird, setzt der Navigationscontroller contentInset und contentOffset auf Werte, die ich nicht möchte. Es scheint zu versuchen, die Statusleiste und die Navigationsleiste anzupassen. Ich würde es sehr bevorzugen, wenn sie in Ruhe gelassen würden. Ich habe dies behoben, indem ich die Getter- und Setter-Methoden für contentInset und contentOffset mit einem Flag überschrieb, das dem Objekt mitteilt, ob es eine Menge akzeptieren soll oder nicht. Aber gibt es einen besseren Weg?
quelle
Ich hatte ein ähnliches Problem, nachdem ich einen viewController geschlossen hatte, wurde das contentOffset aus meiner tableView in (0, -64) geändert.
Meine Lösung war etwas seltsam. Ich habe alle anderen Antworten ausprobiert, aber keinen Erfolg gehabt. Das einzige, was mein Problem behoben hat, war das Ändern der tableView-Position im Steuerelementbaum der .xib
Es war das erste Steuerelement in der übergeordneten Ansicht wie folgt:
Ich habe die tableView direkt nach der ImageView verschoben und es hat funktioniert:
Es scheint, dass das Versetzen der Tabellenansicht in die erste Position das Problem verursacht hat und das Verschieben der Tabellenansicht in eine andere Position das Problem behoben hat.
PD Ich verwende weder AutoLayout noch Storyboards
hoffe das kann jemandem helfen!
quelle
Ich habe zwei Lösungen:
1.
self.view = scrollView;
2.
[self.navigationController.toolbar setTranslucent:NO];
quelle
toolbar
in Ihrem zweiten Beispiel brauchte ichNavigationBar
wie innavigationController.NavigationBar.Translucent = false;
(Anmerkung: Xamarin), was funktioniert hat.Ich habe das gleiche Problem.
Das Einstellen
self.automaticallyAdjustsScrollViewInsets = NO
löste das Problem für einige der Ansichten, jedoch nicht überall.Die zweite Lösung besteht darin, den Inhaltsversatz von Tabellenansicht / Ansicht / Bildlaufansicht in viewWillLayoutSubviews festzulegen:
- (void)viewWillLayoutSubviews { //Arrange the view CGRect tempViewFrame = self.view.frame; if (tempViewFrame.origin.y == 64.0f) { tempViewFrame.origin.y = 0; self.view.frame = tempViewFrame; } }
quelle
Das ist genug
- (void)viewDidLoad { [super viewDidLoad]; self.automaticallyAdjustsScrollViewInsets = NO;
quelle
Dies behebt das Problem in beiden Fällen, wenn:
Statusleiste + Navigationsleiste anzeigen
override func viewDidLayoutSubviews() { NSLog("ORIGIN: \(self.view.frame.origin.y)") if self.view.frame.origin.y == 0 { if let rect = self.navigationController?.navigationBar.frame { let y = rect.size.height + rect.origin.y self.tableView.contentInset = UIEdgeInsetsMake(y, 0, 0, 0) } } else if self.view.frame.origin.y == 44 || self.view.frame.origin.y == 64 { self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0) } }
quelle
Die anderen Antworten mögen für Sie funktionieren, aber sie haben für mich nicht funktioniert. Was für mich funktionierte, war das manuelle Festlegen der
y
Eigenschaft voncontentOffset
inviewDidLayoutSubviews
undviewWillAppear
:override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() // Set the offset to go below the status bar collectionView.contentOffset.y = -UIApplication.shared.statusBarFrame.height } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // Set the offset to go below the status bar collectionView.contentOffset.y = -UIApplication.shared.statusBarFrame.height }
In meinem Fall hatte mein Controller eine untergeordnete Sammlungsansicht, die manchmal
contentOffset
angepasst wurde und manchmal nicht. Ich habe es normalisiert, indem ich es jedes Mal manuell angepasst habe. Ich wollte, dass der Inhalt unter die Statusleiste versetzt wird, also habe ich die Höhe der Statusleiste als Wert verwendet (negativ, weil ich möchte, dass der Inhalt nach unten gedrückt wird).quelle