2016-05-03 16 views
2

私は各セルの内側に2つのUITextViewを並べたUITableViewを持っています。 UITextView内でスクロールする必要がないように、UITableViewCellとUITextViewの両方の高さを増やしたいと思います。ここで私が試したものです:TableViewControllerクラスでUITextViewとUITextViewのUITextViewのテキストが1行を超えて拡大する場合

:TableViewCellクラス(hereからこれを得た)で

self.tableView.estimatedRowHeight = 44 
    self.tableView.rowHeight = UITableViewAutomaticDimension 

func textViewDidChange(textView: UITextView) { 

    var frame : CGRect = textView.frame 
    frame.size.height = textView.contentSize.height 
    textView.frame = frame 
} 

セット幅を超えたユーザーがタイプUITextViewの高さが44から約100に増加し、UITextViewの高さが増加しません。 UITextViewの高さがUITableViewCellの高さと等しくなるように制約を設定しました。

なぜこれが起こっているのでしょうか。UITextViewとUITableViewの高さを正しく動的に変更する方法はありますか?

答えて

6

私の答えは、私たちはまさに私たちの社会的なアプリImpetherの生産に使用するものに基づいています。

class MultiLineTextInputTableViewCell: UITableViewCell { 

    //our cell has also a title, but you 
    //can get rid of it 
    @IBOutlet weak var titleLabel: UILabel! 
    //UITextView we want to expand 
    @IBOutlet weak var textView: UITextView! 

    override init(style: UITableViewCellStyle, reuseIdentifier: String!) { 
     super.init(style: style, reuseIdentifier: reuseIdentifier) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 

    /// Custom setter so we can initialize the height of the text view 
    var textString: String { 
     get { 
      return textView?.text ?? "" 
     } 
     set { 
      if let textView = textView { 
       textView.text = newValue 
       textView.delegate?.textViewDidChange?(textView) 
      } 
     } 
    } 

    override func awakeFromNib() { 
     super.awakeFromNib()   
     // Disable scrolling inside the text view so we enlarge to fitted size 
     textView?.scrollEnabled = false   
    } 

    override func setSelected(selected: Bool, animated: Bool) { 
     super.setSelected(selected, animated: animated) 

     if selected { 
      textView?.becomeFirstResponder() 
     } else { 
      textView?.resignFirstResponder() 
     } 
    } 
} 

持つ:

まず第一に、私たちは展開されますUITextViewを含むカスタムUITableViewCellベースのクラスを(このクラスは自分でデザインすることができ、また、対応するXIBファイルを持っている)持っていますカスタムセルが定義されている場合は、UITableViewControllerベースのクラスで使用できます。

class YourTableViewController: UITableViewController { 

    //in case where you want to have 
    //multiple expanding text views 
    var activeTextView: UITextView? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     //registering nib for a cell to reuse 
     tableView.registerNib(
      UINib(nibName: "MultiLineTextInputTableViewCell", bundle: nil), 
      forCellReuseIdentifier: "MultiLineTextInputTableViewCell") 

    } 

    override func viewWillDisappear(animated: Bool) { 
     super.viewWillDisappear(animated) 
     //hide keyboard when view controller disappeared 
     if let textView = activeTextView { 
      textView.resignFirstResponder() 
     } 
    } 

    // MARK: - Table view data source 

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     //put your value here 
     return 1 
    } 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     //put your value here 
     return 2 
    } 

    override func tableView(tableView: UITableView, 
          cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let row = indexPath.row 
     let cell = tableView.dequeueReusableCellWithIdentifier(
      "MultiLineTextInputTableViewCell", 
      forIndexPath: indexPath) as! MultiLineTextInputTableViewCell 

     let titleText = "Title label for your cell" 
     let textValue = "Text value you want for your text view" 

     cell.titleLabel.text = titleText 
     cell.textView.text = textValue 

     //store row of a cell as a tag, so you can know 
     //which row to reload when the text view is expanded 
     cell.textView.tag = row 
     cell.textView.delegate = self 

     return cell 

    } 

    override func tableView(tableView: UITableView, 
          estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
     //standard row height 
     return 44.0 
    } 

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

    // Override to support conditional editing of the table view. 
    override func tableView(tableView: UITableView, 
          canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { 
     // Return false if you do not want the specified item to be editable. 
     return true 
    } 
} 

//extension containing method responsible for expanding text view 
extension YourTableViewController: UITextViewDelegate { 

    func textViewDidEndEditing(textView: UITextView) { 
     let value = textView.text 
     //you can do something here when editing is ended 
    } 

    func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, 
        replacementText text: String) -> Bool { 
     //if you hit "Enter" you resign first responder 
     //and don't put this character into text view text 
     if text == "\n" { 
      textView.resignFirstResponder() 
      return false 
     } 
     return true 
    } 

    func textViewDidBeginEditing(textView: UITextView) { 
     activeTextView = textView 
    } 

    //this actually resize a text view 
    func textViewDidChange(textView: UITextView) { 

     let size = textView.bounds.size 
     let newSize = textView.sizeThatFits(CGSize(width: size.width, 
      height: CGFloat.max)) 

     // Resize the cell only when cell's size is changed 
     if size.height != newSize.height { 
      UIView.setAnimationsEnabled(false) 
      tableView?.beginUpdates() 
      tableView?.endUpdates() 
      UIView.setAnimationsEnabled(true) 

      let thisIndexPath = NSIndexPath(forRow: textView.tag, inSection: 0) 
      tableView?.scrollToRowAtIndexPath(thisIndexPath, 
               atScrollPosition: .Bottom, 
               animated: false) 
     } 
    } 
} 
+0

答えをありがとう!私はそれを動作させるように見えることはできません私は2つのtextViewsを横に持っている。どちらも高さ制約が設定されていませんが、1つは幅制約があります。私はスクロールを有効にしてみましたが、セルはまだ展開されません。textViewは新しい行に対応するようにプッシュアップされます。何か案は? –

1

まず、自動レイアウトの制約が設定したフレームと矛盾しないことを確認します。 (すべて問題はないがまだ動作しない場合)frameboundsに変更してみてください。ビューのフレーム(CGRect)は、スーパービューの座標系におけるその矩形の位置です。 frameを使用すると、時々私の経験で奇妙な問題が発生する可能性があります。あなたはアプリを使用して、あなたがそこUITextViewを拡大しましたことをTwitterで私に尋ねたので、

func textViewDidChange(textView: UITextView) { 

    var frame : CGRect = textView.bounds 
    frame.size.height = textView.contentSize.height 
    textView.bounds = frame 
} 
+0

私はまだ同じ問題を抱えています。私のtextViewsは並んでおり、高さの制約が設定されていません。私はカスタムセルクラスのtextViewDidChangeを呼び出す必要がありますし、私のtableVCの自動行の高さですか? –