2014-12-27 8 views
14

Ich baue einen Chat. Alles scheint ganz in Ordnung zu sein, aber ich bin auf ein Problem gestoßen.UITableViewWrapperView und UITableView Größe unterscheidet sich mit Autolayout

Ich habe UIViewController mit UITextView Leiste für die Eingabe von Nachrichten und UITableView. Sie sind in dieser Einschränkung: "V:|-(64)-[chatTable][sendMessageBar]-(keyboard)-|". Wenn die Tastatur nicht aus ist - die Konstante dieser Einschränkung ist 0. und nachdem die Tastatur aus ist - ich erhöhe die Konstante auf Tastaturhöhe.

, wenn die Tastatur nicht aus ist:

self.table.contentSize = (375.0,78.5) 
self.table.bounds = (0.0,-490.0,375.0,568.5) 
self.table.frame = (0.0,64.0,375.0,568.5) 
self.table.subviews[0].frame (UITableViewWrapperView) = (0.0,0.0,375.0,568.5) 
self.table.subviews[0].frame (UITableViewWrapperView) = (0.0,0.0,375.0,568.5) 

und wenn die Tastatur herauskommt:

self.table.contentSize = (375.0,78.5) 
self.table.bounds = (0.0,-274.0,375.0,352.5 
self.table.frame = (0.0,64.0,375.0,352.5) 
self.table.subviews[0].frame (UITableViewWrapperView) = (0.0,-137.5,375.0,137.5) 
self.table.subviews[0].frame (UITableViewWrapperView) = (0.0,0.0,375.0,137.5) 

So ist die UITableViewWrapperView, nachdem ich Zwänge konstant erhöhen, unterscheidet sich seine Superview in der Größe - UITableView . Gibt es eine Möglichkeit, das zu beheben? Ich würde annehmen, dass UITableViewWrapperView seinen Rahmen und Grenzen gemäß UITableView ändern würde, aber es nicht tut.

Irgendwelche Ideen wo ist das Problem oder wie könnte ich es umgehen?

ADDING:

Nach einigen mehr Forschung - es scheint, dass es irgendwo zwischen viewWillLayoutSubviews und viewDidLayoutSubviews passiert. Es ist irgendwie komisch tho:

override func viewWillLayoutSubviews() { 
    println("WrapperView Frame :991: \(self.table.subviews[0].frame)") \\ WrapperView Frame :991: (0.0,0.0,375.0,568.5) 
    super.viewWillLayoutSubviews() 
    println("WrapperView Frame :992: \(self.table.subviews[0].frame)") \\ WrapperView Frame :992: (0.0,0.0,375.0,568.5) 
} 

override func viewDidLayoutSubviews() { 
    println("WrapperView Frame :6: \(self.table.subviews[0].frame)") \\ WrapperView Frame :6: (0.0,-137.5,375.0,137.5) 
    super.viewDidLayoutSubviews() 
    println(">> viewDidLayoutSubviews") 
} 

So scheint es, dass dort etwas passiert, das vermasselt die UITableViewWrapperView

Antwort

7

Es scheint, dass es ein Fehler ist (mit diesem Problem zu kämpfen hat den ganzen Tag für mich) Schließlich this Abhilfe half:

for (UIView *subview in tableView.subviews) 
{ 
    if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewWrapperView"]) 
    { 
     subview.frame = CGRectMake(0, 0, tableView.bounds.size.width, tableView.bounds.size.height); 
    } 
} 
+2

Ist das nicht eine der verbotenen APIs von Apple? (UITableViewWrapperView) –

+0

Ist das verboten oder nicht? Ich muss es benutzen. aber Angst. – anamika41

28

Die feste folgenden es für mich:

func fixTableViewInsets() { 
    let zContentInsets = UIEdgeInsetsZero 
    tableView.contentInset = zContentInsets 
    tableView.scrollIndicatorInsets = zContentInsets 
} 

override func viewWillLayoutSubviews() { 
    super.viewWillLayoutSubviews() 
    fixTableViewInsets() 
} 

Ich entdeckte, dass bei viewWillAppear(), dass die Einsätze alle 0 waren. Aber bei viewDidAppear(), wurden sie scheinbar Offset für Navigationsleiste, etc. geändert. Dies unterscheidet die UITableViewWrapperView von der UITableView. Ich änderte die Einsätze in ihrer eigenen Routine, so dass es einfacher war, mit dem Aufruf von verschiedenen Orten zu experimentieren. Die viewWillLayoutSubviews() lassen sie vor dem Präsentieren geändert werden - das Platzieren der Änderung in viewDidAppear() führte zu einem Ruck der Tabelle.

+0

Vielen Dank, es funktioniert perfekt für mich – f1rstsurf

+1

Dies sollte die richtige Antwort auf die Frage sein. Arbeitete für mich. –

+0

Danke, das hat das Problem für mich gelöst. Irgendeine Idee, was dieses Verhalten verursacht? Ich habe 2 Tabellenansichten und nur eine hat sich so verhalten, obwohl sie in der gleichen Inhaltsansicht angezeigt werden. –

4

Ich lief in das heute und während die von @anorskdev vorgeschlagene Reparatur gut funktioniert, scheint es, dass die Ursache des Problems die automaticallyAdjustsScrollViewInsets Eigenschaft von UIViewController ist, die standardmäßig true ist. Ich habe es in meinem Storyboard ausgeschaltet und das Problem ist weg. Achten Sie auf das Kontrollkästchen "Scroll View Insets anpassen" im View Controller Inspector und stellen Sie sicher, dass es deaktiviert ist.

+0

_This_ sollte die richtige Antwort sein, nicht die obige (obwohl es funktioniert) – SparkyRobinson

Verwandte Themen