2014-03-24 12 views
5

Ich habe versucht, in Gewohnheit zu verwenden automatischen Layout UITableViewCell Und versucht, die dynamische Höhe umzusetzen nach dieser SO Themacell.contentView systemLayoutSizeFittingSize: funktioniert nicht für dynamische Höhe Tableview

Using Auto Layout in UITableView for dynamic cell layouts & variable row heights

Aber meine Zelle erstellt wird durch XIB-Datei. So das Verfahren etwas anders ist Hier ist mein Code in heightForRowAtIndexPath

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
myDataItem *item= [[data items] objectAtIndex:[indexPath row]]; 



    CustomCell *cell = [self.offscreenCells objectForKey:@"CustomCell"]; 
    if (!cell) { 
     cell = [CustomCell alloc] init]; 
     [self.offscreenCells setObject:cell forKey:@"CustomCell"]; 
     } 



    [cell.commentView setText:item.comment]; 
    [cell.displayNameView setText:item.displayNameOfItemOwner]; 

    [cell.timeAgoView setText:item.timeAgo]; 
    [cell.imageView setImage:[UIImage imageNamed:@"sis_profile_placeholder"]]; 


    cell.bounds = CGRectMake(0.0f, 0.0f, CGRectGetWidth(tableView.bounds), CGRectGetHeight(_prototypeCell.bounds)); 

    [cell setNeedsLayout]; 
    [cell layoutIfNeeded]; 


    CGFloat height = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height; 
    return height+1; } 

Und die Höhe, die mich von [cell.contentView systemLayoutSizeFittingSize: UILayoutFittingCompressedSize] ist immer und überall „Null“ " Als ich zum Debuggen versucht, ich Ich habe festgestellt, dass alle Untersichten meiner benutzerdefinierten Zelle "nil" sind, aber die Zelle selbst ist nicht "nil". Dies liegt daran, dass die customCell von mir per nib gemacht wird und wenn ich [[CustomCell alloc] init] die Zelle nicht vollständig erstellt.

Aber ich habe versucht, Methode in Zelle = [_tableView dequeueReusableCellWithIdentifier: @ "CustomCell"];

Das Ergebnis ist immer noch das gleiche. Jede Unteransicht ist null. Dies führt dazu, dass die Höhe auf Null zurückgesetzt wird und die Tabellenanzeige falsch angezeigt wird. Gibt es eine Möglichkeit, dies zu lösen?

Ich habe versucht, diese auf AutoLayout zu machen. Tatsächlich, in der vorherigen Version, die ich AutoLayout nicht verwendet habe und die Zelle Höhe manuell berechnen. Es hat tadellos funktioniert. Wie auch immer, ich möchte einfach AutoLayout ausprobieren.

Bitte helfen Danke im Voraus

+2

'cell = [CustomCell alloc] init];' wird nicht funktionieren, wenn Sie beabsichtigen, die Zelle von einer Spitze zu laden. Werfen Sie einen Blick auf [diese Frage] (http://stackoverflow.com/questions/540345/how-do-you-load-custom-uitableviewcells-from-xib-files) für Informationen, wie Sie dies tun. – smileyborg

+0

Vielen Dank. Ich kann jetzt die CustomCell von Xib erstellen. Aber die [cell.contentView systemLayoutSizeFittingSize: UILayoutFittingCompressedSize] gibt immer noch nil –

+0

zurück Diese Methode hat einen Rückgabetyp von CGFloat, nicht ID, also sollte es keine NULL zurückgeben. Aber wenn es 0.0 zurückgibt, haben Sie wahrscheinlich etwas falsch mit den Einschränkungen. Auch hier empfehle ich Ihnen, Ihre Einschränkungen im Code zu beachten, da es viel einfacher ist, zu debuggen und richtig zu arbeiten. – smileyborg

Antwort

1

Hier ist meine Lösung ich Alloc neue Zelle durch NSArray * topLevelObjects = [[NSBundle main] loadNibNamed: @ "CustomCell" Eigentümer: self Optionen: nil]; // Greifen Sie einen Zeiger auf das erste Objekt (vermutlich die benutzerdefinierte Zelle, da alle XIB enthalten sein sollte).

 cell = [topLevelObjects objectAtIndex:0]; 

    -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
myDataItem *item= [[data items] objectAtIndex:[indexPath row]]; 



    CustomCell *cell = [self.offscreenCells objectForKey:@"CustomCell"]; 
if (!cell) { 
     NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil]; 
// Grab a pointer to the first object (presumably the custom cell, as that's all the XIB should contain). 

     cell = [topLevelObjects objectAtIndex:0]; 

    [self.offscreenCells setObject:cell forKey:@"CustomCell"]; 
    } 



[cell.commentView setText:item.comment]; 
[cell.displayNameView setText:item.displayNameOfItemOwner]; 

[cell.timeAgoView setText:item.timeAgo]; 
    [cell.imageView setImage:[UIImage imageNamed:@"image"]]; 


cell.bounds = CGRectMake(0.0f, 0.0f, CGRectGetWidth(tableView.bounds), CGRectGetHeight(_prototypeCell.bounds)); 

[cell setNeedsLayout]; 
[cell layoutIfNeeded]; 


CGFloat height = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height; 
return height+1; } 
+1

'return height + 1' ist für den Separator. Eine flexiblere Methode ist 'CGFloat separator = ((UITableViewCellSeparatorStyleNone! = Self.tableView.separatorStyle)? 1: 0); Rücksprunghöhe + Separator; } ' – SwiftArchitect

0

Soweit ich weiß, unter iOS 8 die vorgeschlagene Lösung für Zellen mit mehrzeiligen Etikett wird nicht funktionieren, weil systemLayoutSizeFittingSize die gewünschte Zellenbreite (einfach ausgedrückt, nicht nehmen berücksichtigt wird es versuchen, das Layout in eine einzelne Zeile beschriften, wodurch die Zelle breiter wird als sie sollte).

Ich konnte dieses Problem lösen, indem ich eine Breitenbeschränkung in Zelle contentView installierte, anstatt die Zellgrenzen zu setzen. Denken Sie daran, diese Einschränkung direkt nach dem Aufruf von systemLayoutSizeFittingSize: zu entfernen.

Verwandte Themen