iOS 7 - navigationController legt das contentInset und das ContentOffset meines UIScrollView fest

69

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?

William Jockusch
quelle

Antworten:

208

Versuchen Sie es self.automaticallyAdjustsScrollViewInsets = NOin Ihrem Hauptansichts-Controller.

Dies wurde in eingeführt, iOS 7sodass Sie dies möglicherweise mit einer iOS-Versionsprüfung abschließen möchten, wenn Sie dies unterstützen iOS 6und darunter.


Aktualisieren

Wenn Sie Storyboards verwenden, können Sie dies sowohl im Interface Builder als auch durch Suchen 'Adjust Scroll View Insets'nach dem ausgewählten Controller tun .

Geben Sie hier die Bildbeschreibung ein

KDaker
quelle
7
Sie können es nur auf IB einstellen, wenn Sie Storyboards verwenden.
Jerrygdm
Das Grausame ist, dass IB zeigt, dass diese Konfiguration nicht korrekt ist; Selbst wenn dieses Flag aktiviert ist, wird es im IB wie bei deaktiviertem Flag angezeigt. Wenn Sie dann den Simulator starten, funktioniert das Flag wie erwartet, was Sie völlig verwirrt. Eine böse Einstellung! :-)
Ursin Brunner
Ich habe einen Tag damit verbracht, herauszufinden, warum meine ImageView nicht in der linken oberen Ecke mit meiner scrollView zentriert ist. Nachdem ich diese Option deaktiviert habe, funktioniert alles!
Zhenyi Zhang
1
Was macht diese Option "Bildlaufansichten anpassen" überhaupt?
Yakiv Kovalskyi
@KDaker - Ich bin im selben Boot wie Yakiv ... dies hat mein Problem gelöst (danke !!!), aber ich würde gerne wissen, was diese Option überhaupt macht und habe keine guten Informationen gefunden anderswo. Vielen Dank!
Spencer
25

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:

Vor

Ich habe die tableView direkt nach der ImageView verschoben und es hat funktioniert:

nach

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!

Chuy47
quelle
War auch mein Problem, iOS 7 Fehler?
Cyril
2
Du bist ein Star! Ich hätte nie gedacht, dass die Reihenfolge der Bildlaufansicht das Problem sein kann.
Andrew L.
4
Der Grund dafür wird durch die akzeptierte Antwort angedeutet. Der UIViewController setzt automatisch den contentInset des ersten UIView. Wenn Sie UITableView zur zweiten Ansicht machen, wird das contentInset nicht automatisch festgelegt.
Michael McGuire
Michael, leider nicht wahr. In meinem Fall wurde die Controller-Eigenschaft nicht überprüft (false) und trotzdem habe ich einen seltsamen Einschub erhalten. Das Ändern der Einfügungen in viewWillAppear auf 0 hat nicht geholfen. Das Verschieben in die Ansichtshierarchie hat jedoch geholfen. Wirklich seltsamer Fehler.
Michał Hernas
Vielen Dank! Ich hätte das nie gefunden, ich musste dem ViewController für dieses Update tatsächlich eine leere Ansicht hinzufügen.
Buyin Brian
5

Ich habe zwei Lösungen:

1.

self.view = scrollView;

2.

[self.navigationController.toolbar setTranslucent:NO];
erstaunlich da
quelle
1
Vielen Dank dafür. Statt toolbarin Ihrem zweiten Beispiel brauchte ich NavigationBarwie in navigationController.NavigationBar.Translucent = false;(Anmerkung: Xamarin), was funktioniert hat.
ta.speot.is
2

Ich habe das gleiche Problem.

  1. Das Einstellen self.automaticallyAdjustsScrollViewInsets = NOlöste das Problem für einige der Ansichten, jedoch nicht überall.

  2. 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;
        }
    }
    
Versierte iPhone
quelle
0

Das ist genug

- (void)viewDidLoad {

    [super viewDidLoad];

    self.automaticallyAdjustsScrollViewInsets = NO;
Vlad
quelle
0

Dies behebt das Problem in beiden Fällen, wenn:

  1. Statusleiste anzeigen
  2. 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)
        }
    }
    
Carlos Javier A. Helguero
quelle
0

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 yEigenschaft von contentOffsetin viewDidLayoutSubviewsund viewWillAppear:

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 contentOffsetangepasst 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).

Eric F.
quelle