2016-05-05 19 views
1

Ich habe einen View-Controller mit Tabellenansicht. Die Tabellenansicht besteht aus einer benutzerdefinierten Zelle mit einem einzelnen Label. Ich habe Text unterschiedlicher Länge, die in diesen Zellen gezeigt werden sollen. Das Problem, dem ich gegenüberstehe, ist, dass die Zellen nicht auf die entsprechende Höhe erweitert werden. Ich habe viele Lösungen in SO getestet, aber keine von ihnen funktioniert so weit. Hier ist der Code für die View-ControllerDynamische Tabellenansicht Zellenhöhe für iOS 7

class ViewController: UIViewController { 

    @IBOutlet var tableView: UITableView! 

    let items = [ 
     "This is the first text", 
     "This is the first text and this is the second text","now you may be thinking where is the third text?. Well, There was the first text and second text, now here is the third text", 
     "This is the fourth short and sweet text", 
     "Slow down you crazy child, you're so ambitious for a juvenile. If you're so smart, tell me why are you still so afraid.","Where's the fire? What's the hurry about. You better cool it off before you burn it out. There's so much to do and so many hours in a day.You got your passion, got your pride. Don't you know that only fools are satisfied. Dream on but don't imagine that they come true. Don't even realise vienna waits for you"] 

    var prototypeCell:CustomCell! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     //setting up tableview 
     self.tableView.allowsSelection = false 
     self.tableView.dataSource = self 
     self.tableView.delegate = self 

     configurePrototypeCell() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func configureCell(cell:CustomCell, forIndexPath indexPath:NSIndexPath) 
    { 
     cell.itemLabel.text = items[indexPath.row] 

    } 


    func configurePrototypeCell() 
    { 
     self.prototypeCell = self.tableView.dequeueReusableCellWithIdentifier("Cell") as! CustomCell 
    } 


} 

extension ViewController:UITableViewDataSource 
{ 
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

     let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as! CustomCell 
     configureCell(cell, forIndexPath: indexPath) 
     return cell 

    } 

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

extension ViewController: UITableViewDelegate 
{ 

    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 

     self.prototypeCell.itemLabel.text = items[indexPath.row] 
     self.prototypeCell.itemLabel.preferredMaxLayoutWidth = CGRectGetWidth(self.tableView.frame) 

     self.prototypeCell.setNeedsLayout() 
     self.prototypeCell.layoutIfNeeded() 


     let size = self.prototypeCell.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize) 
     let height = size.height 
     return height 


    } 

    func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
     return UITableViewAutomaticDimension 
    } 

} 

CustomCell Klasse Unterklasse von UITableViewCell ist. Es enthält UILabel namens itemLabel.

+0

set itemLabels Number of LIne = 0 und Zeilenumbruch-Modus zu Wortumbruch und UITableviewAutomaticDimention –

+0

Unterstützt 'iOS 7' 'Swift'? – AechoLiu

+1

@AechoLiu ja es tut – idocode

Antwort

3

Bitte versuchen Sie dies in benutzerdefinierten Zelle rufen Sie diese von TableviewDelegate Methode der Höhe, um benutzerdefinierte Zelle Höhe zu berechnen.

Code:
let size = sizingCell.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)

+0

Danke! Ich habe Prototyp Cell gemacht. ** contentView ** .systemLayoutSizeFittingSize (UILayoutFittingCompressedSize). – idocode

0
override func viewDidLoad() { 
    super.viewDidLoad() 
    tableView.estimatedRowHeight = 40; 
    tableView.rowHeight = UITableViewAutomaticDimension; 
} 

Dies erfordert Autolayout aktiviert sein und die Zwänge richtig eingestellt werden.

+1

Das funktioniert nur in iOS 8.0+, während ich Lösungen für iOS 7.0 brauche – idocode

0

Hier habe ich Code in Objective-C schreiben, aber Sie können es leicht in Swift ändern.

1) Zunächst einmal stellen Sie die Einschränkung des Labels wie folgt aus:

enter image description here

2) unter Methode in Ihrer customCell.m Datei Implementieren

- (CGFloat)requiredHeight 
{ 
    CGSize size = [self.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; 
    NSLog(@"Size :%@",NSStringFromCGSize(size)); 
    CGFloat minimumHeight = 40.0f; //cell height which you have taken in xib 
    if (size.height < minimumHeight) 
    { 
     return minimumHeight; 
    } 
    return size.height; 
} 

3) in cellForRow einige Änderungen vornehmen und HeightForRow-Methoden wie unten:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    cell.itemLabel.preferredMaxLayoutWidth = tableView.bounds.size.width -36; //Here 36 indicates Leading and Trailing distance of label which you have put in xib 
    [cell.itemLabel updateConstraintsIfNeeded]; 

    return cell; 
} 
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    return [viewAllCell requiredHeight]+[self calculateLabelHeightforText:viewAllCell.Lblname.text andFonts:viewAllCell.Lblname.font andWidth:viewAllCell.Lblname.frame.size.width]-default label height; // 
} 
-(float)calculateLabelHeightforText:(NSString *)text andFonts:(UIFont *)font andWidth:(float)width 
{ 
    if (text==nil) { 
     return 40; //default height 
    } 
    NSAttributedString *attributedText = [[NSAttributedString alloc]initWithString:text attributes:@{NSFontAttributeName:font}] 
    ; 
    CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX} 
               options:NSStringDrawingUsesLineFragmentOrigin 
               context:nil]; 
    return rect.size.height+4; 
} 

4) viewDidLoad eine Änderung vornehmen:

- (void)viewDidLoad { 
[super viewDidLoad]; 
self.TblDetail.rowHeight = UITableViewAutomaticDimension; 
    self.TblDetail.estimatedRowHeight = 40.0; 
} 
0

Versuchen Sie diesen Code, seine Arbeits für mich,

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 

      let str : String! = items[indexPath.row] 

      let boundingRect = str.boundingRectWithSize(CGSizeMake(tableView.frame.size.width - 100, CGFloat.max), 
       options:NSStringDrawingOptions.UsesLineFragmentOrigin, 
       attributes: [NSFontAttributeName: UIFont(name: "Arial", size: 14.0)!], context:nil).size.height + 45.0 

      if(boundingRect > 95.0) { 
       return boundingRect 
      } else { 
       return 95 
      } 

    } 

, wenn Sie den boundingRect Wert zu erhalten, dann wieder seine dynamisch die Höhe UITableView ändern, Hoffnung es ist hilfreich

Verwandte Themen