2015-04-13 3 views
9

anzupassen. Ich möchte die dynamische UITableViewCell Höhe neu in iOS 8 nutzen. Ich muss eine UICollectionView innerhalb einer UITableViewCell platzieren. Ich möchte sicherstellen, dass alle Zellen in der Sammlungsansicht auf dem Bildschirm sichtbar sind. Daher sollte die Größe der Tabellenzelle erhöht werden, damit sie in die Sammlungsansicht passt. Ich habe fast das funktioniert. Ich war einfach nicht in der Lage, die Tabellenzelle auf die richtige Größe zu bringen - sie ist entweder zu lang oder zu kurz in der Höhe, und einige Layoutprobleme sind sichtbar, bis ich mit der Tabelle interagiere (mehr dazu unten).Aktualisiere Sammlungsansichtshöhe, um alle Zellen in einer Tabellenansichtszelle unter Verwendung des automatischen Layouts

Ich habe automatische Layouteinschränkungen für die Sammlungsansicht auf contentView der Tabellenzelle eingerichtet: vor, nach, oben und unten. Ich habe dann eine Höhenbeschränkung für die Sammlungsansicht erstellt, so dass ich die constant im laufenden Betrieb aktualisieren kann, nachdem ich die passende Höhe für alle Zellen in der Sammlungsansicht berechnet habe (weil ich glaube, dass es keine Möglichkeit gibt, dies automatisch zu tun).

Hier ist der Rest des Setups.

viewDidLoad { 
    self.tableView.rowHeight = UITableViewAutomaticDimension 
    self.tableView.estimatedRowHeight = 44 
} 

override func viewWillLayoutSubviews() { 
    super.viewWillLayoutSubviews() 

    let cellDimension = self.collectionView.frame.size.width/7 //always 7 columns 

    let flowLayout = self.collectionView.collectionViewLayout as! UICollectionViewFlowLayout 
    flowLayout.itemSize = CGSizeMake(cellDimension, cellDimension) 

    self.collectionViewHeightConstraint.constant = cellDimension * 4 //always 4 rows 
} 

Ich habe heightForRowAtIndexPath nicht implementiert.

Diese Konfiguration führt zu widersprüchlichen vertikalen Einschränkungen. Ich habe versucht, die Priorität der Beschränkungen zu reduzieren und die Beziehung in einer Reihe von Kombinationen zu ändern, aber keine führte zu dem gewünschten Verhalten. Wenn ich die Priorität der Höhenbeschränkung auf 999 reduziere, ist die Tabellenansichtszelle zunächst zu groß, aber nachdem ich in der Tabellenansicht nach oben und unten geblättert bin, wird die Höhe der Tabellenzelle auf die erwartete Höhe aktualisiert. Bei einigen anderen Kombinationen ist das Ergebnis entweder, dass die Tabellenzelle zu kurz ist, aber die vollständige Sammlungsansicht ausgeblendet wird, die Tabellenzelle zu kurz ist und die Sammlungsansicht abgeschnitten ist oder die Tabellenzelle basierend auf der Priorität und zu groß ist Beziehungen, die ich auf die Einschränkungen angewendet habe. Darüber hinaus werden die Auflistungsansichtszellen nicht in der richtigen Größe angezeigt, während die Ansicht animiert wird (aber bis zum Ende der Animation). Wenn ich die Tabelle neu lade, haben die Zellen der Auflistungsansicht die falsche Größe, bis ich blättern kann Der Tisch.

Wie kann ich diese Darstellungsprobleme beheben, um eine dynamische Tabellenansichtszellenhöhe zu erhalten, die eine vollständig sichtbare Sammlungsansicht mit dynamischer Zellengröße basierend auf der Anzeigebreite enthält?

+0

Ich würde vorschlagen, die rowHeight-Einstellung "self.tableView.rowHeight =" von ViewDidLoad zu ViewWillAppear zu verschieben, Sie können diese Frage auch überprüfen. [link] (http://stackoverflow.com/questions/29263875/uitableviewcells-initial-load-view-display-issue) –

+0

@KevinHorgan Das machte keinen merklichen Unterschied. – Joey

+0

Damit das automatische Layout in UITableViewCell ordnungsgemäß funktioniert, müssen Sie Einschränkungen für alle Layouts in containerView hinzufügen, ohne zu fehlen. Andernfalls funktionieren die automatischen Layouts nicht ordnungsgemäß. Überprüfen Sie den folgenden Link, der detaillierte Informationen zur automatischen Layouteinstellung für tableviewcell http: // stackoverflow enthält .com/questions/29231390/uitableview-merkwürdig-layout-verhaltens-änderungen-auf-scroll/29327082 # 29327082 – Ram

Antwort

0

Hier ist, wie ich das angehen würde, und ich denke, dass es alles in IB getan werden kann.

Zuerst würde ich Mindestgrößen für die CV-Zellen festlegen, dann würde ich die Umarmungs-Priorität des Lebenslaufs festlegen, um seinen Inhalt so eng wie möglich zu umarmen. Das sollte garantieren, dass alle äußeren Einflüsse auseinanderliegen, der CV wird versuchen, die kleinstmögliche Größe zu haben, die alle seine Zellen sichtbar macht.

Als nächstes würde ich das gleiche Spiel mit der Inhaltsansicht der TBV-Zelle und dem Lebenslauf spielen, das heißt, ich würde die Umarmungs-Priorität der Inhaltsansicht der TBV-Zelle festlegen, um den Lebenslauf so eng wie möglich zu umarmen. Auch dies sollte sicherstellen, dass externe Einflüsse vernachlässigt werden, die TBV-Zelle sollte die kleinste Größe behalten, die sie behalten muss, um den Lebenslauf vollständig anzuzeigen.

0

Werfen Sie einen Blick darauf, wie forkingdog das gleiche Problem der dynamischen Höhen von Zellen hier Tableview> https://github.com/forkingdog/UITableView-FDTemplateLayoutCell

gelöst hat Sie in der Lage sein sollte, den Imageview für uicollectionview wechseln aus. enter image description here

In seiner Tableview - statt die aus der Box geschätzte Zeilenhöhe mit - Sie brauchen etwas wie

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return [tableView fd_heightForCellWithIdentifier:@"FDFeedCell" configuration:^(FDFeedCell *cell) { 
     cell.entity = self.feedEntities[indexPath.row]; 
    }]; 
} 



#import "UITableView+FDTemplateLayoutCell.h" 
#import <objc/runtime.h> 

@implementation UITableView (FDTemplateLayoutCell) 

- (id)fd_templateCellForReuseIdentifier:(NSString *)identifier; 
{ 
    NSAssert(identifier.length > 0, @"Expects a valid identifier - %@", identifier); 

    NSMutableDictionary *templateCellsByIdentifiers = objc_getAssociatedObject(self, _cmd); 
    if (!templateCellsByIdentifiers) { 
     templateCellsByIdentifiers = @{}.mutableCopy; 
     objc_setAssociatedObject(self, _cmd, templateCellsByIdentifiers, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
    } 

    UITableViewCell *templateCell = templateCellsByIdentifiers[identifier]; 
    if (!templateCell) { 
     templateCell = [self dequeueReusableCellWithIdentifier:identifier]; 
     templateCellsByIdentifiers[identifier] = templateCell; 
    } 

    return templateCell; 
} 

- (CGFloat)fd_heightForCellWithIdentifier:(NSString *)identifier configuration:(void (^)(id))configuration 
{ 
    // Fetch a cached template cell for `identifier`. 
    UITableViewCell *cell = [self fd_templateCellForReuseIdentifier:identifier]; 

    // Reset to initial height as first created, otherwise the cell's height wouldn't retract if it 
    // had larger height before it gets reused. 
    cell.contentView.bounds = CGRectMake(0, 0, CGRectGetWidth(self.frame), self.rowHeight); 

    // Manually calls to ensure consistent behavior with actual cells (that are displayed on screen). 
    [cell prepareForReuse]; 

    // Customize and provide content for our template cell. 
    if (configuration) { 
     configuration(cell); 
    } 

    // Add a hard width constraint to make dynamic content views (like labels) expand vertically instead 
    // of growing horizontally, in a flow-layout manner. 
    NSLayoutConstraint *tempWidthConstraint = 
    [NSLayoutConstraint constraintWithItem:cell.contentView 
           attribute:NSLayoutAttributeWidth 
           relatedBy:NSLayoutRelationEqual 
            toItem:nil 
           attribute:NSLayoutAttributeNotAnAttribute 
           multiplier:1.0 
            constant:CGRectGetWidth(self.frame)]; 
    [cell.contentView addConstraint:tempWidthConstraint]; 

    // Auto layout does its math 
    CGSize fittingSize = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; 

    [cell.contentView removeConstraint:tempWidthConstraint]; 

    // Add 1px extra space for separator line if needed, simulating default UITableViewCell. 
    if (self.separatorStyle != UITableViewCellSeparatorStyleNone) { 
     fittingSize.height += 1.0/[UIScreen mainScreen].scale; 
    } 

    return fittingSize.height; 
} 

@end 
1

Von dem, was ich von Ihnen Code verstehen können die Collection Zellen in der Einrichtung und Größe, es scheint mir, dass Sie quadratische Sammlung Zellen haben wollen, und 4 Reihen von 7 Zellen haben und alle vollständig sichtbar.

Wenn Sie der collectionView, die sich in der Zelle befindet, Einschränkungen zu allen 4 Rändern (oben, unten, links und rechts) hinzufügen und dann eine aspect ratio Constraint von 7: 4 zur Auflistungsansicht hinzufügen, sollte die Tabellenansicht in der Lage sein Berechnen Sie automatisch die Zellenhöhe für Sie in der richtigen Größe.

+0

Dies führt zu widersprüchlichen Einschränkungen. Ich brauche auch die Elemente, um den verfügbaren Platz zu füllen - sollte kein Abstand zwischen den einzelnen Zellen sein. – Joey

+0

Sie müssen die Höhe der Tabellenansichtszelle entsprechend einstellen, um die widersprüchlichen Einschränkungen zu beseitigen. Wenn Sie es ausführen, wird die Tabelle die Größe der Zelle richtig einstellen, aber in IB müssen Sie es tun. Es sollte nicht so schwer sein, mit dem 7: 4-Verhältnis zu berechnen. Damit die Elemente den gesamten verfügbaren Speicherplatz ausfüllen, müssen Sie die itemSize für die collectionView festlegen. Aber Achtung, Sie haben in jeder Zelle eine CollectionView, also müssen Sie sie in einer der Funktionen der tableView-Datenquelle einstellen. – pteofil

+0

Das brachte mich auf den Gedanken, dass das, was Sie mit in Tabellenansichtszellen eingebetteten collectionViews erreichen wollen, mit nur einer collectionView und was Sie in jede tabellarische Zelle, die Sie in Abschnitte in CollectionView einfügen, tun würden, viel einfacher erledigt werden könnten. – pteofil

Verwandte Themen