2016-08-22 2 views
0

Итак, я пытаюсь создать общий чат-пузырь-взгляд с изменяемым размером и меткой внутри ячейки UITableView. Все хорошо работало, пока я не попытался добавить изменчивую функцию. Он немного сокращается внизу (или не дает никакого поля), и я не работал с полностью динамическими ячейками, как это раньше, поэтому я не уверен, как это исправить. Я попытался добавить буфер 20px, но это не помогло. Я ценю помощь! (код ниже)Resizable TableView Cell

Simulator screenshot of tableview

import QuartzCore 
import UIKit 

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 

    @IBOutlet weak var tableView: UITableView! 

    var listOfStrings = [String]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view, typically from a nib. 

    // When I Uncomment the 2 lines below, the cell cuts off and only displays a little bit of the blue view. 
    // self.tableView.rowHeight = UITableViewAutomaticDimension 
    //   self.tableView.estimatedRowHeight = 75 
     listOfStrings.append("Switch, Button, Segmented Control, Slider, Textfield") 
     listOfStrings.append("Switch, Button, Segmented Control, Slider, Textfield") 
     listOfStrings.append("Switch, Button, Segmented Control, Slider, Textfield") 
    } 


    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     print(indexPath.row) 
    } 

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

     let cell = self.tableView.dequeueReusableCellWithIdentifier("someCell") as! SomeTableViewCell 

     cell.contentView.viewWithTag(0)!.backgroundColor = UIColor.clearColor() 
     let size = cell.layer.bounds 
     let tableSize = self.tableView.layer.bounds 
     let viewCGR = CGRect(x: size.minX, y: size.height/2, width: tableSize.width, height: size.height/2) 
     let view: UIView = UIView(frame: viewCGR) 

     let labelCGR = CGRect(x: 0, y: 0, width: viewCGR.width, height: viewCGR.height) 
     let label: UILabel = UILabel(frame: labelCGR) 
     label.numberOfLines = 0 

     label.preferredMaxLayoutWidth = CGRectGetWidth(tableView.bounds) 


     label.textAlignment = NSTextAlignment.Center 
     label.text = listOfStrings[indexPath.row] 
     label.sizeToFit() 
     self.tableView.updateConstraints() 


     let newViewCGR = CGRect(x: viewCGR.minX, y: viewCGR.minY, width: label.frame.width+20, height: label.frame.height+20) 
     view.frame = newViewCGR 
     view.sizeToFit() 
     label.textColor = UIColor.blackColor() 
     label.center.x = view.center.x 
     // self.tableView.updateConstraints() 
     view.addSubview(label) 
     self.tableView.updateConstraints() 
     view.backgroundColor = UIColor.blueColor() 
     view.layer.cornerRadius = 6 
     cell.addSubview(view) 
     self.tableView.updateConstraints() 
     return cell 

    } 

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

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


} 

КСТАТИ Я не использую autolayout + ограничения, чтобы получить функциональные возможности иметь пузырь в состоянии появиться на левой или правой (в зависимости от входящего или исходящего).

+0

[Установить высоту] (https://www.hackingwithswift.com/read/32/2/automatically-resizing-uitableviewcells-with-dynamic-type-and-ns), тогда перезагрузите эту строку. ['reloadRowsAtIndexPaths:'] (http://stackoverflow.com/questions/3069339/how-to-dynamically-resize-uitableviewcell-height) – twodayslate

+0

попробуйте вызвать 'cell.layoutIfNeeded()' перед 'return cell' и использовать' UITableViewAutomaticDimension ' – Tj3n

+0

use heightForRowAtIndexPath: динамически вычислять высоту текста и изменять высоту ячейки в соответствии с ней –

ответ

0

После нового API яблоком вы не вычисляете высоту. Вы просто используете автозапуск для выполнения работы. Думаю, this link может вам помочь. Кстати, есть хороший учебник Self-sizing Table View Cells

+0

Этот способ не позволяет вам изменять местоположение представления или метки. Это становится проблемой, когда я хочу изменить сторону, на которую отображается представление. –

+0

Вы знаете, как появляются входящие сообщения слева, а исходящие сообщения появляются справа? Ограничения делают это так, что вы не можете этого сделать –

+0

попробуйте дать высоту UILabel> 0. Измените ограничение высоты от = до> – Priyansh

0

Вам не нужно рассчитать высоту строки для ячейки высоты. добавить этот код в viewDidLoad()

tableView.rowHeight = UITableViewAutomaticDimension 
    tableView.estimatedRowHeight = 50 
0

@Ryan найти высоту ячейки с текстом, используя следующий метод,

CGRect textRect = 
    [attributedText boundingRectWithSize:CGSizeMake(cellWidth, CGFLOAT_MAX) 
    options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) 
    context:nil]; 

вызов этого метода из

heightForRowAtIndexPath:

и установить высоту ячейку здесь как textRect.size.height