2017-01-09 13 views
0

Мне нужна конкретная высота для каждого table viewcell У меня есть. Высота зависит от содержимого (= высота UITextField внутри cell).tableView.dequeueReusableCell() внутри таблицыRow (_: heightForRowAt :) метод

Чтобы вычислить его высоту, я хочу создать «prototypeCell» и добавить текст к нему, чтобы получить необходимую высоту. Это единственное, для чего мне нужна эта созданная ячейка. Я попытался это:

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

     let entry = fetchedResultsController.object(at: indexPath) 

     guard !entry.isFault else { // some entries are faults, somehow 
      return 0 
     } 

     let prototypeCell = tableView.dequeueReusableCell(withIdentifier: "bitCell") as! BitCell 
     prototypeCell.configure(entry: entry) // add text and stuff 

     // .cellContentHeight calculates the height I need for the cell 
     return prototypeCell.cellContentHeight + baseRowHeight 
    } 

У меня есть два вопроса относительно этого:

  1. я пропускаю все entry объектов, которые являются разломами (есть довольно много из них, когда я открываю приложение с табличномом). Имеет ли это какое-либо негативное воздействие?

  2. Могу ли я использовать tableView.dequeueReusableCell() в рамках этого метода? Насколько я понимаю, он деактивирует существующую ячейку и создает новую. Но потом я как бы сбрасываю эту камеру. Это плохо?

Если вам не нужен код, скажите мне. Я не уверен, что нужно, чтобы ответить на это.

Заранее благодарен!

+3

не называйте 'tableView.dequeueReusableCell' вне' cellForRowAt'. – rmaddy

+0

Есть ли другой способ получить "cell" с идентификатором "bitCell"? Я попытался использовать init класса 'BitCell()', но он не работает – Quantm

+0

вместо этого: https://www.raywenderlich.com/129059/self-sizing-table-view-cells – Jake

ответ

1

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

class func suggestedHeight(text:String) -> CGFloat{ 
    let label = UILabel(frame:CGRectMake(0,0,UIScreen.mainScreen().bounds.size.width - LABEL_LEFT_AND_RIGHT_PADDING,1)) 
    label.font = UIFont(name: "Regular", size: 14) 
    label.numberOfLines = 0 
    label.text = text 
    label.sizeToFit() 
    return TOP_PADDING + label.frame.height 
} 

Тогда в heightForRow

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    let entry = fetchedResultsController.object(at: indexPath) 
    return BitCell.suggestedHeight(text:entry) 
} 
+0

отличная идея! Мне приходилось оценивать только «LABEL_LEFT_AND_RIGHT_PADDING», но это сложно, поскольку у меня есть ограничения, которые позволяют рассчитать точное заполнение. Благодаря! – Quantm

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

  • Нет связанных вопросов^_^