2015-07-17 1 views
2

У меня возникла проблема с UITextView внутри пользовательской ячейки. TextView отлично работает помимо моей проблемы. У меня есть настройка UITextViewDelegate, поэтому, когда что-то происходит с текстовым представлением, у меня есть те методы, которые связаны.UITextView и динамическое обновление высоты ячейки на основе содержимого текстового представления?

Я хотел бы знать, как я могу создать свою собственную ячейку, динамически увеличивая ее высоту по мере того, как пользователь вводит. Как только пользователь нажимает на конец строки текстового поля, также имеет текстовое представление, которое автоматически добавляет другую строку. Я искал в Интернете какое-то время, и большинство примеров для этой проблемы находятся в объективе c. Не очень быстрый код. Буду признателен за любую помощь.

У меня есть клетка зацепили в файле Tableview как таковой ..

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

     let cell: cellCustom = the_TableView.dequeueReusableCellWithIdentifier("cell") as! cellCustom 

     return cell 
} 

В пользовательском файле ячейки, у меня есть делегатов настроенные ...

func textViewDidChange(textView: UITextView) { 


    } 


func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool { 


     return true 
    } 

Я попытался некоторые вещи, такие как ...

self.textview.sizeToFit() 

self.the_TableView.rowHeight = UITableViewAutomaticDimension 
     self.the_TableView.estimatedRowHeight = 47 

Когда я это сделал, текст просмотрел весь текст, но не увеличился в размере пока я не ушел в отставку, это первый ответчик и прокручивается, пока камера не исчезнет. Затем, когда ячейка отскакивает назад, она обновляется.

Я уже добавил все ограничения, и проект имеет нулевые риски или ошибки и работает отлично.

Чтобы уточнить, я хотел бы, чтобы uitextview изменял высоту в зависимости от содержимого, которое пользователь вводит при вводе, что означает, что пользовательская ячейка и tableview должны будут обновляться. Подумайте о ясном приложении на iPhone. Как будто. Ячейка обновляется динамически по мере того, как пользователь вводит значение, увеличивая высоту, добавляя новую строку, когда пользователь достигает конца. Это то, к чему я стремлюсь.

Хотя я не новичок в разработке любыми способами, я до сих пор не дошел до этой стадии разработки. Любая помощь будет чрезвычайно оценена. Поскольку у меня есть пользовательская ячейка в другом файле, мне трудно получить доступ к моим элементам ячейки из файла tableview. Я думаю, новичок. Спасибо, что прочитал это.

+0

Цепной свои ограничения, TextView в верхней части электролизера , textView до нижней части ячейки и установите ограничение высоты текста в виде фиксированной высоты. И объявление d другие ограничения, которые вам нужны. Затем, после того как вы изменили ограничение по высоте textView, вы вызываете 'layoutIfNeeded()' для текущей ячейки –

+0

@pandarencodemaster Спасибо за ввод. Я уже выполнил все свои ограничения. Однако добавление ограничения высоты вызывает множество рисков в отладчике. Ограничения отлично работают во всех устройствах. Кроме того, не могли бы вы рассказать о 'layoutIfNeeded'? – RandomDude

+0

Если вы хотите, чтобы ваши обновления по ограничениям работали, вы должны использовать layoutIfNeeded, чтобы они вступили в силу сразу после изменения любого ограничения. –

ответ

9

Это работает для ИОС 7 тоже

это идет в ваш tableviewcell

protocol HeightForTextView { 
    func heightOfTextView(height: CGFloat) 

} 

class TableViewCell: UITableViewCell { 

    @IBOutlet weak var textView: UITextView! 

    var delgate:HeightForTextView? 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     // Initialization code 
    } 

    func textViewDidChange(textView: UITextView) { 

     var fixedWidth: CGFloat = textView.frame.size.width 
     var newSize: CGSize = textView.sizeThatFits(CGSizeMake(fixedWidth, CGFloat.max)) 

     if let iuDelegate = self.delgate { 

      iuDelegate.heightOfTextView(newSize.height) 
     } 


    } 

} 

контроллер TableView должен быть

class TableViewController: UITableViewController,HeightForTextView { 

     var textViewHeight = CGFloat() 

    //In your cell for row method set your your delegate 
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! TableViewCell 
    cell.delgate = self 

    return cell 
} 


//delegate method 

    func heightOfTextView(height: CGFloat) { 

    textViewHeight = height 
    self.tableView.beginUpdates() 
    self.tableView.endUpdates() 

    } 

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

      return textViewHeight + 70 
    } 

    } 
+0

Спасибо! Это работает. Я должен был иметь расширение, хотя для вызова tableview, поскольку textview находится в отдельном файле. Это технически делает новый планшет. Немного неряшливо. – RandomDude

+0

Напишите делегата или добавьте наблюдателя в этот файл, чтобы вы могли получить высоту и перезагрузить табличное представление при изменении текста. Если это не ясно, я могу помочь вам в этом ... –

+0

Буду признателен, как вы это сделаете. С тех пор как я добавил расширение, моя кнопка отстает на 2 секунды, что неприемлемо, когда дело доходит до пользовательского интерфейса. Мне очень понравилась бы твоя помощь. Как бы вы добавили наблюдателя? Моя пользовательская ячейка находится в другом файле, поэтому я не могу получить доступ к моему представлению таблицы. Как бы вы к этому подошли? Еще раз спасибо за ваш ответ выше. Я ценю это. – RandomDude

Смежные вопросы