2008-10-21 15 views
15

Wenn Sie einen UITableViewController verwenden, erstellt die initWithStyle: -Methode automatisch das zugrunde liegende UITableView mit - laut der Dokumentation - "die richtigen Dimensionen".Verwenden eines UITableViewController mit einer kleinen Tabelle?

Mein Problem ist, dass diese "korrekten Abmessungen" 320x460 (die Bildschirmgröße des iPhone) scheinen, aber ich schiebe dieses TableView/Controller-Paar in einen UINavigationController, der selbst in einer UIView enthalten ist, die etwa die halbe Höhe hat des Bildschirms.

Kein Rahmen oder Grenzen Streiten Ich komme auf scheint scheint die Tabelle die Größe zurückgesetzt, und als solche ist es "zu lang", was bedeutet, es gibt eine Sammlung von Zeilen, die vom unteren Rand des Bildschirms geschoben werden und nicht sind sichtbar oder durch Scrollen erreichbar.

Also meine Frage kommt auf: Was ist die richtige Art und Weise zu einem UITableViewController zu sagen, die Größe seiner Komponente UITableView auf ein bestimmtes Rechteck zu ändern?

Danke!

aktualisieren Ich habe versucht, alle hier ohne Erfolg vorgeschlagen Techniken, aber ich habe eine interessante Sache finden: wenn ich eschew die insgesamt UINavigationController (was ich noch nicht bereit bin für die Produktion zu tun, sondern als Experiment), und fügen Sie die Tabellenansicht als direkte Unteransicht der einschließenden Ansicht, die ich erwähnte, die Rahmengröße gegeben wird respektiert. Die sehr Moment Ich führe den UINavigationController wieder in den Mix, egal ob es als Subview vor oder nach der Tabellenansicht hinzugefügt wird, und egal, ob es/vor oder nach der Tabellenansicht als Subview hinzugefügt wird Das Ergebnis ist das gleiche wie zuvor.

Ich fange an UINavigationController zu vermuten, ist nicht viel von einem Teamplayer ...

Update 2 Der Vorschlag Rahmengröße zu überprüfen, nachdem die Tabellenansicht auf dem Bildschirm ein gutes war: stellt sich heraus, dass Der Navigationscontroller ändert tatsächlich die Größe zwischen Laden und Anzeigen. Meine Lösung, bestenfalls Hacky, bestand darin, den gegebenen Frame beim Laden zwischenzuspeichern und ihn zurückzusetzen, wenn er am Anfang von tableView geändert wurde: cellForRowAtIndexPath :. Warum fragst du? Weil es der einzige Ort ist, den ich gefunden habe, der funktioniert hat, deshalb!

Ich halte dies nicht für eine Lösung, da es offensichtlich unpassend ist, aber zum Nutzen anderer Leser scheint es zu funktionieren.

Antwort

11

Warum nicht einfach einen normalen UIViewController verwenden und die Tabelle manuell erstellen?

+1

einverstanden war, erstrecken sich nur UIViewController statt und Tableview Eigenschaft auf eigene Faust wie diese @property (nonatomic, retain) UITableView \t *tableView; Zennichimaro

1

Ich stimme Bens Antwort. Ich bin oft in die Situation geraten, in der ich ein UITableView aufgrund anderer Steuerelemente in einer Ansicht verkleinern muss.

Ich habe normalerweise nur einen regulären UIViewController mit einem UITableView IBOutlet. Dann, wenn es nötig ist, kann ich einfach den Rahmen des UITableView-Objekts manipulieren, um ihn auf die Größe zu bringen, die ich brauche.

+0

Pflege hinzufügen genau zu erarbeiten, wie Sie dies erreichen? – rpj

+1

Verwenden Sie einfach den normalen UIViewController und - zum Beispiel - programmgesteuert, erstellen Sie TableView - UITableView * mTableView = [[UITableView Alloc] initWithFrame: CGRectMake (0,0,320,400)]; mTableView.delegate = Selbst; [[Selbstansicht] addSubview: mTableView]; und da hast du es! :) –

1

Ich bin mir nicht sicher, warum Sie einen zusätzlichen View-Controller für Ihre Tabelle erstellen. In Ihrem Code sehe ich jedoch nicht, dass Sie die Tabellenansicht zu ihrem übergeordneten Element hinzufügen. Sie können auch versuchen, die Begrenzungshöhe zu reduzieren, bis das Ganze auf dem Bildschirm erscheint. Sobald Sie das tun, kann es Ihnen einen Einblick geben, warum es nicht so funktioniert, wie Sie es erwarten.

+0

Ich brauche einen View-Controller, um in der Lage zu sein, auf einen UINavigationController zu drücken, weshalb er da ist. Daher hatte ich den Eindruck, dass es nicht notwendig war, die Tabellenansicht zur übergeordneten Ansicht hinzuzufügen, weil der View-Controller dies per Proxy übernimmt. Fehle ich etwas? – rpj

+0

Ordnen Sie den View-Ausgang von MyUIViewControllerSubclass Ihrer Tabelle oder der umgebenden Ansicht zu? –

+0

Wie in dem Code, den ich als "Antwort" geschrieben habe, angegeben habe, ordne ich definitiv die "View" -Ausgabe der Tabelle zu, die ich gerade erstellt habe. – rpj

1

Überprüfen Sie die Eigenschaften autoresizingMask und contentMode des UITableView. Diese können beide den Rahmen beeinflussen.

0

Wenn Sie den Interface Builder verwenden, können Sie einfach zum Eigenschaftenfenster "Tabellenansichtsgröße" wechseln und die unteren Einfügungen für Inhalt und Scroller mit der Höhe eines anderen Widgets ändern.

+0

Nein .. nicht für mich. –

3

Ich hatte das gleiche Problem und ich löste es durch Größenanpassung der TableView in der ViewDidAppear-Funktion des UITableViewController. Nicht die ideale Lösung, aber es funktioniert.

+0

Unglaublich! Fast hätte ich es nicht einmal versucht, aber das war das EINZIGE, was ich bei der Größenänderung der Tabellenansicht eines UITableViewControllers erreichen konnte. Ich habe nur den Rahmen der Tabellenansicht in viewDidAppear gesetzt und es funktioniert perfekt. Vielen Dank! – user3344977

6

Ich hatte das gleiche Problem, und ich löste es mit:

-(void) loadView { 
    [self setView:[[[UIView alloc] initWithFrame:CGRectZero] autorelease]]; 
    [[self view] setAutoresizesSubviews:NO]; 

    /* Create & configure table and other views... */ 

    [self setResultsTable:[[RadarTableViewController alloc] initWithNibName:nil bundle:nil]]; 
    [[resultsTable view] setFrame:CGRectMake(0,45,320,200)]; 
} 

Dies ist in den Eltern gemacht (nur einen schlichten UIViewController in meinem Fall) Controller.

+0

Thx, meine 181 px TableView in einem UIViewController wurde immer geschrumpft, jetzt hört es sich die Frame-Einstellungen an, da ich Ihre [[self view] setAutoresizesSubviews: NO]; – Allisone

+1

Eine bessere Lösung wäre wahrscheinlich, stattdessen die 'autoresizingMask'-Eigenschaft der Tabellenansicht zu modifizieren, indem Sie die Breite, nicht aber die Höhe der Tabelle ändern. – aopsfan

2

Sie können den oberen Rand gesetzt, indem Sie:

UIEdgeInsets inset = UIEdgeInsetsMake(50, 0, 0, 0); 
    self.tableView.contentInset = inset; 

es ist keine gute Praxis, nur für den Fall, dass Sie auf mehr Platz möchten Sie es verwenden können.

Sollte verwenden UITableViewController nicht, nur einfach Verwenden UIViewController und programmatisch erstellen UITableView

-2

den Rahmen in UINavigationController Set.

0

Versuchen:

self.edgesForExtendedLayout = UIRectEdgeNone; 

//This one in case your NavigationController is not Translucent 
self.extendedLayoutIncludesOpaqueBars = NO; 

Hoffnung, das hilft.

1

i fixiert dieses Problem durch diesen Code

{ 
    UIEdgeInsets insets; 
    insets.left = 0; 
    insets.right = 0; 
    insets.top = 0; 
    insets.bottom = 60; 
    self.tableView.contentInset = insets; 
    [self.tableView setScrollIndicatorInsets:insets]; 
} 
Verwandte Themen