Подтвердить что ты не робот

Как получить UITableViewCell в heightForRowAtIndexPath?

Как получить 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), то, я думаю, мой подход не может действительно работать?

4b9b3361

Ответ 1

Для 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)

Ответ 2

Вы можете использовать делегат tableview вместо самого tableView.

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

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

ОБНОВЛЕНО

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

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

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

Ответ 3

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

heightForRowAtIndexPath

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

  • TableView запрашивает у него источник данных, сколько секций он будет иметь. -numberOfSectionsInTableView
  • Рассматривает источник данных, сколько строк будет иметь каждая секция (знать, как должен быть большой скроллер и т.д.) -numberOfRowsInSection
  • Просит, чтобы он делегировал высоту каждой видимой строки. Чтобы узнать, где будут расположены ячейки. - heightForRowAtIndexPath
  • Наконец, он запрашивает источник данных, чтобы дать ему ячейку для отображения по указанному пути указателя -cellForRowAtIndexPath

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


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

UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

Ответ 4

Очевидным ответом является вызов cellForRowAtIndexPath, но вы, возможно, уже обнаружили, что есть некоторые проблемы с этим. См. Этот вопрос, если вы еще этого не сделали: UITableView гибкая/динамическая 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;
}

Ответ 5

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

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

Ответ 6

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