2017-08-02 1 views
0

Ich habe eine UITableView mit benutzerdefinierten UITableViewCell s. Autolayout ist deaktiviert. Die UITableViewCell enthält eine UILabel und eine UITextView. Die UITextView ist mit Text gefüllt, der sich in der Länge unterscheidet. Wie kann ich die Höhe des UITextView dynamisch anpassen? Ich habe es mit dieser Funktion aus awakeFromNib versucht und nachdem der Text gesetzt ist aber nichts geändert.UITableViewCell Größe ändern UITextView von Inhalt und Mitte vertikal

func adjustHeight(theTextView: UITextView) { 

    let contentSize = theTextView.sizeThatFits(theTextView.bounds.size) 
    var frame = theTextView.frame 
    frame.size.height = contentSize.height 
    theTextView.frame = frame 

    let aspectRatioTextViewConstraint = NSLayoutConstraint(item: theTextView, attribute: .height, relatedBy: .equal, toItem: theTextView, attribute: .width, multiplier: theTextView.bounds.height/theTextView.bounds.width, constant: 1) 
    theTextView.addConstraint(aspectRatioTextViewConstraint) 
} 
+0

Sie haben geschrieben, dass Autolayout deaktiviert ist, aber Sie fügen es manuell in Code hinzu? Was meinen Sie? –

+0

Legen Sie diese Eigenschaften fest. tableView.RowHeight = UITableView.AutomaticDimension; tableView.EstimatedRowHeight = 160f; // nach deiner Zelle. Höhe für Textansicht berechnen. Wie in diesem Link: https://StackOverflow.com/A/25158206/1242673 gelten berechnete Höhe TextView. –

+0

@RomanPodymov ich habe? Entschuldigung, ich bin neu in der iOS-Entwicklung und habe die Aufgabe, eine Textansicht auf den Inhalt anzupassen. Und mir wurde gesagt, Autolayout ist ausgeschaltet. – elpatricko

Antwort

0

Versuchen Sie, diese

yourTextView.numberOfLines = 0 

Dadurch wird der Text auf Linien durchbrechen, wenn der Text zu lang ist.

Wenn dies nicht zu Ihnen passt und Sie möchten nur 1 Zeile, dann fügen Sie diese Zeile nach dem Setzen des Textes (oder in der Delegate-Funktion der textView) hinzu.

yourTextView.sizeThatFits(yourFrame) 

Dadurch wird der Text kleiner, um die von Ihnen angegebene Größe zu erreichen.

Hoffe, das hilft!

+0

myTextView hat nicht die Eigenschaft numberofLines. Und ich möchte so viele Zeilen wie nötig verwenden – elpatricko

+0

Dann, was ist das Problem? –

+0

Der Text ist zu lang, um in eine Zeile zu passen. Aber die UITableViewCell zeigt nur eine Zeile der TextView. Keine Größenänderung – elpatricko

0

Ich kann Ihnen ein Beispiel geben, das Ihr Problem lösen kann. Ich verwende SnapKit https://github.com/SnapKit/SnapKit, um Einschränkungen von UIView zu aktualisieren. Dies ist ein Beispiel für UIViewController, wo Sie wollen Ihren Tisch zeigen:

class ViewController: UIViewController { 

    private var tableView : UITableView = { 

     let tabView = UITableView.init(frame: CGRect.zero) 
     tabView.register(TableViewCell.self, forCellReuseIdentifier: "cell") 
     return tabView 
    }() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.tableView.dataSource = self 
     self.tableView.delegate = self 
     self.view.addSubview(self.tableView) 
    } 

    override func updateViewConstraints() { 

     self.tableView.snp.remakeConstraints { (maker) in 

      maker.edges.equalTo(self.view) // your table will have the same frame as your view 
     } 

     super.updateViewConstraints() 
    } 
} 

In der ersten Erweiterung werden wir alle Methoden für UITableViewDelegate setzen:

extension ViewController : UITableViewDelegate { 

    func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { 

     return 200.0 // any value different from zero. 200 is an example. This value must be easy-to-calculate. 
    } 

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 

     return UITableViewAutomaticDimension // tells system that rows will be resized automatically 
    } 
} 

In der zweiten Erweiterung gibt es Methoden für UITableViewDataSource (nur zu erzeugen, einige Zufallsdaten):

extension ViewController : UITableViewDataSource { 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

     return 20 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

     let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell 
     cell.setup(labelText: "Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label ", textViewText: "Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text ") 
     return cell 
    } 
} 

und Klasse der Zelle, die UILabel undenthält:

class TableViewCell: UITableViewCell { 

    private var label : UILabel = { 

     let resultLabel = UILabel.init(frame: CGRect.zero) 
     resultLabel.numberOfLines = 0 // If numberOfLines in 0 system will automatically set real number of lines 
     return resultLabel 
    }() 

    private var textView : UITextView = { 

     let resultTextView = UITextView.init(frame: CGRect.zero) 
     resultTextView.isScrollEnabled = false // disable scroll and editing just for example 
     resultTextView.isEditable = false 
     return resultTextView 
    }() 

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 

     super.init(style: style, reuseIdentifier: reuseIdentifier) 

     self.contentView.addSubview(self.label) 
     self.contentView.addSubview(self.textView) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    func setup(labelText:String, textViewText:String) { 

     self.label.text = labelText 
     self.textView.text = textViewText 
     self.setNeedsUpdateConstraints() 
    } 

    override func updateConstraints() { 

     self.label.snp.remakeConstraints { (maker) in 

      maker.left.equalTo(self.contentView.snp.left) 
      maker.right.equalTo(self.contentView.snp.right) 
      maker.top.equalTo(self.contentView.snp.top) 
      maker.bottom.equalTo(self.textView.snp.top) 
     } 
     self.textView.snp.remakeConstraints { (maker) in 

      maker.left.equalTo(self.contentView.snp.left) 
      maker.right.equalTo(self.contentView.snp.right) 
      maker.bottom.equalTo(self.contentView.snp.bottom) 
     } 
     super.updateConstraints() 
    } 
} 
Verwandte Themen