2014-01-07 6 views
6

Ich habe einige Tutorials zur Verwendung von AutoLayout gelesen, aber ich kann einfach nicht herausfinden, wie ich etwas erreichen kann, was meiner Meinung nach unglaublich einfach sein sollte. Ich entwerfe eine Anwendung für 3,5 und 4 Zoll iPhone/iPod Touch Bildschirme. Es ist eine einfache Tab-Leiste Anwendung mit einer UITableView die Gesamtheit der einzelnen Register füllt, etwa so:Interface Builder "Objekt" an Bildschirmkanten "sperrt"

Interface Builder

Ich möchte mich für die UITableView an den Rändern des Bildschirms zu sperren, und zwar unabhängig davon, ob der Bildschirm 3,5 oder 4 Zoll. Was ich momentan habe funktioniert gut auf 4-Zoll-Bildschirmen, aber auf 3.5 erstreckt sich UITableView über die Breite des Bildschirms.

Ich habe versucht, einige AutoLayout-Tutorials zu lesen sowie mit Einschränkungen des Interface Builders zu experimentieren, aber ohne Erfolg. Ich würde jede Hilfe schätzen, die Sie zur Verfügung stellen können.

+0

Für das, was Sie tun, dann kann man auch nur Auto-Layout deaktivieren und die die automatische Maske (Federn und Streben) die Tabellenansicht auf alle vier Kanten an Pin und erlauben Sie es, flexibel Breite und Höhe zu sein. Wenn Sie jedoch an der Verwendung von Auto Layout interessiert sind, empfehle ich Ihnen, Ihre Einschränkungen im Code anstelle von Interface Builder zu erstellen, da IB sehr mühsam sein kann und in vielen Fällen nicht das ist, was Sie sehen. Ich habe eine nette Open-Source-API, die es viel einfacher macht, und es gibt auch ein Beispielprojekt, mit dem Sie spielen können: https://github.com/smileyborg/UIView-AutoLayout – smileyborg

+0

(Mit der UIView + AutoLayout-API brauchen Sie nur eine line: '[tableView autoPinEdgesToSuperviewEdgesWithInsets: UIEdgeInsetsZero];') Es ist so einfach! – smileyborg

+0

Welche Einschränkungen haben Sie jetzt festgelegt? Sie können diese veröffentlichen, damit wir Ihnen zeigen können, wo Sie schief gelaufen sind. – greg

Antwort

7

Sie müssen die UITableView an allen Kanten des Mutter UIView befestigen, und dann wird das UITableView vergrößern oder verkleinern die UIView auf dem Gerät zu füllen. Dadurch erscheint die richtige Größe auf allen iDevices, einschließlich iPad. Wie weiter unten im Screenshot abgebildeten, können Sie einfach die gestrichelte rote Führer alle tippen, sicherstellen, dass die Ränder auf 0 gesetzt sind (die Seiten berühren):

AutoLayout via IB for a UITableView touching all sides of the parent view

Sie könnten auch Ctrl + Ziehen Sie nach links, Ziehen Sie den Mauszeiger nach rechts, ziehen Sie ihn nach oben und ziehen Sie ihn auf UITableView, indem Sie "Leading Space to Container", "Trailing Space to Container", "Top Space to Top Layout Guide" und "Bottom Space to Bottom Layout" wählen.

Alternativ können Sie die Visual Format Language (VFL) (Code für einen UIViewController unten übernimmt Ihre UITableView ist eine auto- @synthesized@property namens tableView) verwenden:

/* Turn off springs/structs */ 
self.tableView.translatesAutoresizingMaskIntoConstraints = NO; 

/* Leading and trailing constraints */ 
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_tableView]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_tableView)]]; 
/* Top and bottom constraints */ 
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_tableView]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_tableView)]]; 

... oder wenn Sie wirklich gerne explizit sein (und wie Typisierung):

/* Leading constaint (could use NSLayoutAttributeLeft here as well) */ 
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.tableView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1 constant:0]]; 
/* Trailing constraint (could use NSLayoutAttributeRight here as well) */ 
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.tableView attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTrailing multiplier:1 constant:0]]; 
/* Top constraint */ 
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.tableView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1 constant:0]]; 
/* Bottom constraint */ 
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.tableView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1 constant:0]]; 

das Wichtigste bei all dem ist, dass die UITableView ein Kind desistder UIViewController (es ist wahrscheinlich). view füllt den Bildschirm standardmäßig wie erwartet aus, und bei allen oben genannten Methoden bitten Sie das Layout, sich eng an den Kanten dieser maximierten Ansicht zu halten.

1

NSLayoutConstraints ist lächerlich Overkill für diese IMHO. einfach deaktivieren und machen diesen

self.tableview.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
+0

FYI Ich bin mir ziemlich sicher, dass iOS diese Autoresizing-Maske sowieso in Layout-Einschränkungen hinter den Kulissen übersetzt, so dass Jefs Antwort eine sehr einfache Möglichkeit ist, Layout-Einschränkungen zu nutzen. – bgfriend0

+0

Interessant, danke für das .. Außer auf früheren Systemen pre iOs7 wird es wie erwartet funktionieren, anstatt den Dummy zu spucken und eine 'wtf is NSLayoutConstraint' Ausnahme auszulösen :) – Jef

+0

Richtig. Wenn Sie interessiert sind, können Sie in der UIView-Eigenschaft transmittedAutoresizingMaskIntoConstraints nachsehen. – bgfriend0

Verwandte Themen