2015-12-23 9 views
5

Ich möchte die UITableView auf die Höhe für alle Inhalte in der Tabellenansicht anpassen.Dynamic UITableView height

Das ist mein Storyboard

enter image description here

Das Problem dabei ist, die obere und untere Image ist auf dem Bildschirm immer statisch.

enter image description here

Die dort sind wohl 10 Elemente auf der Tabellenansicht sein, aber nur 7 zeigt aufgrund Bildschirmgröße Begrenzung nach oben. Ich möchte alle 10 zeigen, bevor Benutzer das untere ImageView sehen kann. (Btw, alle drei von den Ansichten, dh. Sowohl die Bildansichten und Tableview ist in einer UIScrollView)

IDEAL

enter image description here

Einige der anderen Einschränkungen, die ich habe, mit zu arbeiten ist, dass Die Anzahl der Elemente in der Tabellenansicht ist dynamisch, was bedeutet, dass sie in einer beliebigen Menge von normalerweise weniger als 10 sein kann, die ich später von einer API abrufen werde. Und auch die Zellenhöhe ist abhängig vom Inhalt dynamisch.

Ich habe gerade erst mit einigen einfachen Code gestartet

class ExampleViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 
     @IBOutlet weak var tableView: UITableView! 

    var items: [String] = [ 
    "Item 01", "Item 02", "Item 03", "Item 04", "Item 05", 
    "Item 06", "Item 07", "Item 08", "Item 09", "Item 10"] 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell") 
    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return self.items.count; 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell:UITableViewCell = self.tableView.dequeueReusableCellWithIdentifier("cell")! as UITableViewCell 
    cell.textLabel?.text = self.items[indexPath.row] 
    return cell 
    } 

} 
+0

haben Sie versucht, self.items.count * row_height Dies wird die Höhe basierend auf Inhalt geben, aber Sie müssen andere Bedingungen schreiben, um die Bildschirmhöhe zu überprüfen – Smile

+0

Warum fügen Sie nicht die oberen und unteren Bildansichten in der Kopfzeile und Fußzeile der Tabellenansicht? – Muneeba

+0

Kopf- und Fußzeilen funktionieren nicht wirklich, da die obere und untere Bildansicht nur eine Repräsentation von Ansichten darstellt. In Wirklichkeit ist es eine Ansicht mit viel mehr Komponenten, Label, Bildern und Einschränkungen. – WKL

Antwort

2

Sie benötigen einen IBOutlet zum NSLayoutConstraint einzustellen, der die tableView Höhe setzt (zuerst müssen Sie das schaffen height constraint mit jedem Wert, spielt keine Rolle) und dann Strg ziehen Sie es in Ihre Klassendatei

enter image description here

Dann müssen Sie in Ihrer viewWillAppear die Höhe tableView berechnen und einstellen.Wie folgt:

var tableViewHeight:CGFloat = 0; 
for (var i = tableView(self.tableView , numberOfRowsInSection: 0) - 1; i>0; i-=1){ 
    tableViewHeight = height + tableView(self.tableView, heightForRowAtIndexPath: NSIndexPath(forRow: i, inSection: 0)) 
} 
tableViewHeightLayout.constant = tableViewHeight 

Und das ist es ziemlich viel. Dies gibt Ihnen die Größe Ihres scrollView-Inhalts und sollte keine Warnungen auslösen.

1

In diesem Fall nicht Ihre untere Zelle statisch macht, macht es zu einem Teil der Tabellenansicht und fügen Sie diese untere Bild in letzter Zeile Tabelle Delegiertenmethode anzeigen - insertRowAtIndexPath

1

Bei dieser Art von Fall fügen Sie Ihr unteres Bild (rot) in einer Tabellenfußansicht hinzu.

Zur Fußzeile Ansicht in UITableView fügen Sie verwenden können:

tableViewObj.tableFooterView = footerViewObj; 
1

Sie müssen wahrscheinlich die Tabellenansicht Eigeninhaltsgröße implementieren. Bitte überprüfen Sie diese answer um zu sehen, ob es hilft.

Ich erinnere mich an dieses Problem und schuf sogar eine benutzerdefinierte UITableView Unterklasse.

#import "IntrinsicTableView.h" 

@implementation IntrinsicTableView 

#pragma mark - UIView 

- (CGSize)intrinsicContentSize 
{ 
    return CGSizeMake(UIViewNoIntrinsicMetric, self.contentSize.height); 
} 

#pragma mark - UITableView 

- (void)endUpdates 
{ 
    [super endUpdates]; 
    [self invalidateIntrinsicContentSize]; 
} 

- (void)reloadData 
{ 
    [super reloadData]; 
    [self invalidateIntrinsicContentSize]; 
} 

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation 
{ 
    [super reloadRowsAtIndexPaths:indexPaths withRowAnimation:animation]; 
    [self invalidateIntrinsicContentSize]; 
} 

- (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation 
{ 
    [super reloadSections:sections withRowAnimation:animation]; 
    [self invalidateIntrinsicContentSize]; 
} 

- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation 
{ 
    [super insertRowsAtIndexPaths:indexPaths withRowAnimation:animation]; 
    [self invalidateIntrinsicContentSize]; 
} 

- (void)insertSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation 
{ 
    [super insertSections:sections withRowAnimation:animation]; 
    [self invalidateIntrinsicContentSize]; 
} 

- (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation 
{ 
    [super deleteRowsAtIndexPaths:indexPaths withRowAnimation:animation]; 
    [self invalidateIntrinsicContentSize]; 
} 

- (void)deleteSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation 
{ 
    [super deleteSections:sections withRowAnimation:animation]; 
    [self invalidateIntrinsicContentSize]; 
} 

@end 
1

Versuchen Sie, diese auch

in ViewDidLoad 

self.table.estimatedRowHeight = 44.0 ; 
self.table.rowHeight = UITableViewAutomaticDimension; 

Höhe für die Zeile an der Indexpfad

-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 
return UITableViewAutomaticDimension;} 
4
  1. Subclass Ihre UITableView die intrinsicContentSize außer Kraft zu setzen seine Content, so zu sein:

    override var intrinsicContentSize: CGSize { 
        return contentSize 
    } 
    
  2. Dann nutzen Sie automatische Zeilenhöhen für Ihren Tisch, Ihr so ​​exampleViewController des viewDidLoad hätte:

    tableView.estimatedRowHeight = 44 
    

    Und die UITableViewDelegate-Funktion:

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
        return UITableViewAutomaticDimension 
    } 
    
  3. Wenn Sie Daten aus Ihrem API erhalten und Ihre Tabelle neu zu laden, rufen Sie einfach:

    tableView.invalidateIntrinsicContentSize() 
    

    Dies wird sagen Sie Ihren Tisch selbst als sein Inhalt auf die gleiche Größe, um die Größe (wegen der Überschreibung) und Verschieben Sie Ihr unteres Bild nach Bedarf.


Wenn Ihr Storyboard einen Fehler wirft sagen, dass Ihre UIScrollView eine mehrdeutige Höhe hat, weil es auf der UITableView keine Höhenbeschränkung ist, Ihre UITableView auswählen und einen Platzhalter innere Größe in der Größe Inspector geben.

+1

genial! Ich kann wirklich nicht glauben, dass das nicht Teil von iOS ist. Ist das nicht ein wirklich häufiger Anwendungsfall? –

+0

danke @MartinMassera! Ich stimme zu, es hat eine Weile gedauert, bis ich herausgefunden hatte, wie ich das am besten mache, aber ich habe diesen Ansatz schon einige Male benutzt. Ich wollte keine Unterklasse erstellen, aber ich dachte, es wäre immer noch am saubersten, anstatt Einschränkungen manuell zu aktualisieren. – Cody

+0

genial! beste Lösung – Mikhail