2017-08-02 2 views
0

J'ai obtenu un UITableView avec UITableViewCell s. L'autolayout est désactivé. Le UITableViewCell contient un UILabel et un UITextView. Le UITextView est rempli de texte dont la longueur varie. comment puis-je ajuster dynamiquement la hauteur de la UITextView? Je l'ai essayé avec cette fonction de awakeFromNib et après le texte est défini mais rien n'a changé.UITableViewCell redimensionner UITextView à partir du contenu et du centre verticalement

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

Vous avez écrit que la mise en forme automatique est désactivée, mais que vous l'ajoutez manuellement au code? Que voulez-vous dire? –

+0

Définissez ces propriétés. tableView.RowHeight = UITableView.AutomaticDimension; tableView.EstimatedRowHeight = 160f; // selon votre cellule. Calculez la hauteur pour la vue de texte. comme dans ce lien: https://stackoverflow.com/a/25158206/1242673 appliquer la hauteur calculée à textview. –

+0

@RomanPodymov je l'ai fait? désolé je suis nouveau dans le développement d'iOS et j'ai eu la tâche de redimensionner le contenu d'un textview. Et on m'a dit qu'autolayout est éteint. – elpatricko

Répondre

0

Essayez cette

yourTextView.numberOfLines = 0 

Cela briser le texte aux lignes si le texte est trop long.

Si cela ne vous convient pas et que vous ne voulez qu'une ligne, ajoutez cette ligne après avoir défini le texte (ou dans la fonction déléguée de textView).

yourTextView.sizeThatFits(yourFrame) 

Cela réduira le texte pour qu'il corresponde à la valeur que vous avez spécifiée.

Espérons que cela aide!

+0

myTextView n'a pas la propriété numberofLines. Et je veux utiliser autant de lignes que nécessaire – elpatricko

+0

Alors quel est le problème? –

+0

le texte doit être long pour tenir dans une ligne. Mais le UITableViewCell montre seulement une ligne du TextView. Pas de redimensionnement – elpatricko

0

Je peux vous donner un exemple qui peut résoudre votre problème. J'utilise SnapKit https://github.com/SnapKit/SnapKit pour mettre à jour les contraintes de UIView. Ceci est un exemple de UIViewController où vous voulez montrer votre table:

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() 
    } 
} 

Dans la première extension, nous allons mettre toutes les méthodes pour UITableViewDelegate:

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 
    } 
} 

Dans la deuxième extension il existe des méthodes pour UITableViewDataSource (simplement générer des données aléatoires):

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 
    } 
} 

et la classe de cellule qui contient UILabel et UITextView:

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() 
    } 
}