2014-06-20 5 views
8

Ich habe eine UITableView, die eine UISearchBar Subview hat. Dies ist alles auf der Ansicht eines UIViewController zusammen mit ein paar anderen Unteransichten (Etiketten, Textfelder und dergleichen).UISearchBar auf UITableView seltsames Offset-Problem

Die Suchleiste und der Inhaltsoffset der Tabelle verhalten sich ziemlich merkwürdig, aber es scheint abhängig von der Reihenfolge, in der diese Ansichten der Hauptansicht in der Xib hinzugefügt werden. Ich habe ein Beispielprojekt mit nur meiner Tabelle/Suche und einem Label erstellt, um zu testen, und das Ergebnis ist das gleiche. Wenn der Tisch nach das Etikett hinzugefügt wird, funktioniert alles einwandfrei:

Setup:

table added after label

Correct und Erwartetes Ergebnis:

Proper expected result

jedoch, wenn ich Ändern Sie einfach die Reihenfolge, in der meine 2 Unteransichten auf der Hauptansicht sitzen (aka Tabelle hinzugefügt vor das Etikett) dann beginnen seltsame Dinge zu passieren.

offenbar schlecht Setup:

Table added before label

Sonderbare Offset von Search Bar:

wtf is this?!?!

Ich bin nichts anderes überhaupt zu ändern, also warum nicht Xcode scheint die Ordnung zu sorgen Diese Subviews werden zur Hauptansicht hinzugefügt ?? Wenn ich die "schlechte" Tabellenkonfiguration nach oben scrolle, verschwindet die Suchleiste sofort an der oberen Kante, aber der Inhalt der Tabelle wird weiter nach oben scrollen, bis sie den oberen Rand des Rahmens erreicht, der in der xib gesetzt wurde. Scrollen Sie zurück nach unten und die Suchleiste erscheint nicht wieder bis zum merkwürdig abgesenkten Standort. Dies ist in Xcode 5.1.1, nicht in der neuen Beta. Das Ergebnis ist dasselbe mit oder ohne Autolayout.

Eine Idee, warum das passiert? Ist das ein Fehler, oder fehlt mir etwas? (Ich habe keinen Code gepostet, weil ich nur die Anzahl der Abschnitte, Zeilen und den Text auf der Zelle festlege. Nicht mit Inhaltseinfügungen, Offset, irgendetwas. Ich lade die Ansicht vom App-Delegaten als die Wurzel eines Nav-Controllers)

+0

Bitte fügen Sie SearchBar auf TableViewCell oder TableView HeaderView hinzu. –

Antwort

13

Dies geschieht, weil ein UIViewController ‚s-Eigenschaft automaticallyAdjustsScrollViewInsets

Mit iOS 7 genannt, haben UIViewControllers eine Eigenschaft automaticallyAdjustsScrollViewInsets genannt, und es standardmäßig YES. Wenn Sie eine Bildlaufansicht haben, die entweder die Stammansicht Ihrer Ansicht Controller (z. B. mit einem UITableViewController) oder die Unteransicht Index 0 ist, dann wird diese Eigenschaft sowohl die contentInset und die scrollIndicatorIsets anpassen. Dadurch kann die Bildlaufansicht unter der Navigationsleiste ihre Inhalte und Bildlauf-Anzeigen starten (wenn sich Ihre Ansicht in einem Navigationscontroller befindet).

Von Big Nerd Ranch

Wenn Sie Storyboards verwenden, können Sie es ändern, indem die View-Controller auswählen und im Attribute-Inspektor Adjust scroll view insets abzuwählen.

Hier ist seine Beschreibung von apple documentation:

Der Standardwert ist YES, die der View-Controller durch die Statusleiste, Navigationsleiste verbraucht anzupassen seine Ansicht blättern Einsätze als Reaktion auf die Bildbereiche ermöglicht, und Symbolleiste oder Tab-Leiste. Setzen Sie den Wert auf NO, wenn Sie Scroll View Inset-Anpassungen selbst verwalten möchten, z. B. wenn in der Ansichtshierarchie mehr als eine Bildlaufansicht vorhanden ist, wenn .

+0

Können Sie genauer angeben, wo diese Option ist? Ich sehe es nicht im Attribute-Inspector für den View-Controller, die Tabellenansicht oder die Suchleiste (mit oder ohne Autolayout) – Stonz2

+0

Ich habe herausgefunden, dass Sie es nicht in XIB-Dateien sehen. Es wird nur in Storyboards angezeigt. Bus noch können Sie die 'automaticallyAdjustScrollViewInsets' Eigenschaft in '-ViewDidLoad' –

+0

Setzen Sie also die Tabelle an der richtigen Stelle, basierend auf wie es in der Xib gesetzt ist (unabhängig von der Reihenfolge, in der es hinzugefügt wird). Ich bin immer noch neugierig, WARUM dies geschieht, basierend auf der Reihenfolge der Subviews in der XIB. Wenn die Tabelle als zweites hinzugefügt wird, scheint es korrekt zu sein, ob die Scroll-Ansichts-Einsätze automatisch angepasst werden oder nicht. Warum muss es nur gesetzt werden, wenn die Tabelle zuerst ist? – Stonz2

1

Ich habe dasselbe Problem vor über die Position von Tableview und Suchleiste. Ich habe folgendes versucht und es funktioniert für mich.

Wenn Sie nicht Code für das schreiben und wenn es nur Problem von Xib oder Storyboard ist, dann versuchen Sie alle Autosizing und Herkunft Einstellung Steckdose, um seine Position zu beheben und den Unterschied zu sehen. es kann Arbeit für dich sein.

enter image description here

+0

Das behebt das Problem nicht. Außerdem weiß ich, wie man das Problem behebt (die anderen Unteransichten vor der Tabelle anordnen), die Frage, die ich habe, ist, WARUM es das tut. – Stonz2

0

UITableView-Header kann enthält nur eine UIView, wenn Sie also UISearchBar Plus UILabel benötigen, müssen Sie sie in UIView wickeln und diese Ansicht als UITableView-Header hinzufügen.

+0

Das Label befindet sich nicht in der Tabellenansicht, es befindet sich direkt in der Hauptansicht. – Stonz2

0

Update: automaticallyAdjustsScrollViewInsets hat in ios 11 und ein neues Feld contentInsetAdjustmentBehavior wurde eingeführt, veraltet.

if #available(iOS 11.0, *) { 
    tableview.contentInsetAdjustmentBehavior = .never 
} else { 
    automaticallyAdjustsScrollViewInsets = false 
}