2012-10-08 6 views
16

Ich versuche, eine UIView zu einem UITableView-Header hinzufügen, dann mit den NSLayoutConstraints möchte ich ihm eine Höhe geben.Verwenden NSLayoutConstraints auf eine Header-Ansicht UITableView

Ich habe durch die Apple Docs und die WWDC 2012 Videos geschaut, aber ich kann diesen bestimmten Fehler nirgendwo finden!

Ich habe den folgenden Code:

- (UIImageView *)logoImageView 
{ 
    if (!_logoImageView) { 
     _logoImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"logo"]]; 
     [_logoImageView setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    } 
    return _logoImageView; 
} 

... in viewDidLoad

UIView *tableHeaderView = [[UIView alloc] init]; 
tableHeaderView.translatesAutoresizingMaskIntoConstraints = NO; 

[tableHeaderView addSubview:self.logoImageView]; 

[self.tableView setTableHeaderView:tableHeaderView]; 

NSDictionary *constraintViews = @{@"tableView" : self.tableView, @"tableHeaderView" : tableHeaderView, @"logoImageView" : self.logoImageView}; 

[self.tableView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[tableHeaderView(50)]" 
                     options:0 
                     metrics:nil 
                     views:constraintViews]]; 

Allerdings, wenn ich es laufen bekomme ich folgende Fehlermeldung:

2012-10-08 16:31:34.559 myApp[6934:c07] *** Assertion failure in -[UITableView layoutSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2372/UIView.m:5776 
2012-10-08 16:31:34.561 myApp[6934:c07] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Auto Layout still required after executing -layoutSubviews. UITableView's implementation of -layoutSubviews needs to call super.' 
*** First throw call stack: 
(0x199b012 0x17c0e7e 0x199ae78 0x1256f35 0x7589ef 0x17d46b0 0x622fc0 0x61733c 0x622eaf 0x7f78cd 0x7401a6 0x73ecbf 0x73ebd9 0x73de34 0x73dc6e 0x73ea29 0x741922 0x7ebfec 0x738bc4 0x738dbf 0x738f55 0x741f67 0x705fcc 0x706fab 0x718315 0x71924b 0x70acf8 0x27e8df9 0x27e8ad0 0x1910bf5 0x1910962 0x1941bb6 0x1940f44 0x1940e1b 0x7067da 0x70865c 0x6d5d 0x2395) 
libc++abi.dylib: terminate called throwing an exception 
+3

Darf ich fragen, ob Sie jemals eine Lösung für dieses Problem gefunden haben? –

Antwort

2

Der beste Weg, dies zu überwinden, ist die Verwendung von Interface Builder, um den Header UITableView einzurichten, und dann ein Outlet zur Höhe NSLayoutConstraint hinzuzufügen.

+3

Können Sie erarbeiten. Keine Ahnung, was das bedeutet. – jgvb

+0

'NSLayoutConstraint' sind regelmäßige Objekte, so können Sie Steckdosen für sie erstellen von Interface Builder, und manipulieren ihre Eigenschaften zur Laufzeit genau wie für eine IB-Ansicht (zum Beispiel) –

+0

Ich sehe keine Möglichkeit, Höhen- oder Breiten-Layout-Constraint zu 'UITableView' Kopf- oder Fußzeile im Storyboard hinzuzufügen Add New Constraints' hat alles blockiert. – derpoliuk

3

I hatte dieselbe Ausnahme, als ich versuchte, die Tabellenkopfansicht zu setzen. Als ich bemerkte, dass die Ansicht Contraints hatte, deaktivierte ich einfach die Option "Auto-Layout verwenden" im Storyboard.

Screenshot: http://i.stack.imgur.com/5jWHy.png

Das ist für mich gelöst.

+8

Dies funktioniert nur um das Problem herum, es nicht zu beheben :(Sie können nicht einfach Auto-Layout ausschalten! – jgvb

1

Versuchen Sie folgendes:

logoImageView.translatesAutoresizingMaskIntoConstraints = YES; 

(Wenn Werke nicht, versuchen Sie zu entfernen:

tableHeaderView.translatesAutoresizingMaskIntoConstraints = NO; //Remove this line 

:)

0

ich keine richtige Lösung für dieses Problem bekommen haben, aber sie können behebe es, indem du frames verwendest und setze die Eigenschaft translateAutoresizingMaskIntoConstraints nicht auf "No" (standardmäßig ja, also setze es nicht)

CGRect headerViewFrame = CGRectMake(0,0,320,60); //Frame for your header/footer view 

UIView *tableHeaderView = [[UIView alloc] initWithFrame:headerViewFrame]; 
tableHeaderView.translatesAutoresizingMaskIntoConstraints = Yes; //Or don't set it at all 
[self.tableView setTableHeaderView:tableHeaderView];