Как получить UITableViewCell в пределах heightForRowAtIndexPath? - PullRequest
27 голосов
/ 10 марта 2011

Как получить UITableViewCell в методе heightForRowAtIndexPath, то есть с учетом indexPath?

(тогда я мог получить доступ к просмотрам контента, которые я создал, чтобы добавить их высоты)

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
  // How to get the UITableViewCell associated with this indexPath?
}

спасибо

РЕДАКТИРОВАТЬ: На самом деле действительно ли есть правильный способ сделать это? Когда я помещаю некоторые операторы NSLog, кажется, что heightForRowAtIndexPath он вызывался несколько раз перед вызовами на cellForRowAtIndexPath (где я установил UILabels в ячейке)? Этот вид подразумевает, что меня могут попытаться использовать метод, который не будет работать, т.е. я надеялся в heightForRowAtIndexPath получить доступ к уже созданным меткам в каждой ячейке, чтобы получить их высоту и сложить их вместе для общей высоты строки ячейки, ОДНАКО если они еще не были настроены (в пределах cellForRowAtIndexPath), то я думаю, что мой подход не может работать?

Ответы [ 6 ]

24 голосов
/ 31 марта 2014

Вы можете использовать делегат табличного представления вместо самого tableView.

id cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];

Проверьте ответ здесь

ОБНОВЛЕНО

В новых версиях iOS и при использовании правильных автоматических ограничений вам больше не нужно ссылаться на ячейку, чтобы вычислить высоту ячейки.

Проверьте здесь

https://www.raywenderlich.com/129059/self-sizing-table-view-cells

19 голосов
/ 28 ноября 2013

Этот вопрос не имеет смысла, потому что в

heightForRowAtIndexPath

ячейки еще не созданы.Вот как работает tableView:

  1. TableView запрашивает у своего источника данных, сколько разделов у него будет.-numberOfSectionsInTableView
  2. Запрашивает у источника данных, сколько строк будет иметь каждый раздел (чтобы узнать, каким должен быть большой скроллер и т. Д.) -numberOfRowsInSection
  3. Запрашивает высоту каждого делегата видимая строка .Знать, где будут располагаться клетки.- heightForRowAtIndexPath
  4. Наконец, он просит источник данных дать ему ячейку для отображения по заданному пути индекса -cellForRowAtIndexPath

Таким образом, вы не можете получить доступ к ячейкам с heightForRowAtIndexPath, потому что снаиболее вероятная ячейка еще не создана.


Однако, если я неправильно понял ваш вопрос, попробуйте:

UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
14 голосов
/ 10 марта 2011

Очевидный ответ - позвонить cellForRowAtIndexPath, но вы, возможно, уже обнаружили, что с этим есть некоторые проблемы.См. Этот вопрос, если вы еще этого не сделали: UITableView Flexible / Dynamic heightForRowAtIndexPath

Для моего последнего проекта я использовал собственный подкласс UICell и реализовал такой метод.Затем я вызвал это из table:heightForRowAtIndexPath: (после поиска содержимого этой строки).

+ (CGFloat) heightOfContent: (NSString *)content
{
    CGFloat contentHeight = 
           [content sizeWithFont: DefaultContentLabelFont
               constrainedToSize: CGSizeMake( DefaultCellSize.width, DefaultContentLabelHeight * DefaultContentLabelNumberOfLines )
                   lineBreakMode: UILineBreakModeWordWrap].height;
    return contentHeight + DefaultCellPaddingHeight;
}
4 голосов
/ 10 марта 2011

Я бы посоветовал вам рассчитать правильную высоту строки в table:heightForRowAtIndexPath:, используя вашу структуру данных (Высота текста, изображений, многослойный текст и т. Д.).

И изменить высоту компонента вих -(void) layoutSubviews метод.

1 голос
/ 08 января 2013

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

0 голосов
/ 10 марта 2011

Для iOS8 :

override func viewDidLoad() {
        super.viewDidLoad()

        self.tableView.estimatedRowHeight = 80
        self.tableView.rowHeight = UITableViewAutomaticDimension
    }

ИЛИ

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

    }

Но для iOS7 ключ вычисляет высоту после автоматического размещения,

func calculateHeightForConfiguredSizingCell(cell: GSTableViewCell) -> CGFloat {
        cell.setNeedsLayout()
        cell.layoutIfNeeded()
        let height = cell.contentView.systemLayoutSizeFittingSize(UILayoutFittingExpandedSize).height + 1.0
        return height

    }

Примечание:

1) Если помечены несколько строк, не забудьте установить numberOfLines в 0.

2)Не забудьте label.preferredMaxLayoutWidth = CGRectGetWidth(tableView.bounds)

...