Получение кадра UITableViewCell - PullRequest
       0

Получение кадра UITableViewCell

8 голосов
/ 04 октября 2011

Я расстроился этим вопросом пару дней. Я пытаюсь добавить UILabel в UITableViewCell. Я хочу, чтобы UILabel охватывал всю ширину ячейки, минус 5 или 10 на правой и левой сторонах для образов. Моя проблема заключается в программном определении размера рамки ячейки, в которой нужно разместить метку. Независимо от того, какой UITableViewStyle я использую, значение cell.contentVew.frame.size.width не находится рядом с шириной самого кадра ячейки.

Например, в таблице, которую я создаю, я могу достичь желаемого результата, создав подкласс UITableViewCell и создав UILabel с определенной вручную шириной (путем проб и ошибок):

CGRectMake(10, 12, 397, self.contentView.frame.size.height);

Но это тот номер 397, который меня раздражает. Я хочу способ программно определить, каким он должен быть для любой ширины таблицы или стиля. Это должен быть простой процесс, просто определив ширину всего кадра ячейки, а затем вычтя 10 или 20, чтобы края UILabel фактически не касались края ячейки.

Однако, если я установлю tableViewStyle на UITableViewStyleDefault, а затем попробую:

NSLog(@"Width: %f", self.contentView.frame.size.width);

Я получаю 320. Если я установлю стиль для любого из трех других стилей, возвращаемое число будет 302. Даже число 320 не находится рядом с шириной рамки ячейки (как с моим вручную определенным числом 397 ).

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

РЕДАКТИРОВАТЬ для получения дополнительной информации:

Одно разъяснение для всех, кто заинтересован. Этот мой вопрос относится главным образом к таблице сгруппированных стилей. Для простого стиля ответ на мой вопрос выше может быть определен просто в методе cellForRowAtIndexPath:

CGFloat cellWidth = [tableView rectForRowAtIndexPath:indexPath].size.width;

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

Ответы [ 2 ]

8 голосов
/ 05 октября 2011

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

Этот код будет предоставлять метку в ячейке tableView, которая охватывает ячейку с полем между двумя краями ячейки и центрируется вертикально внутри ячейки.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{    
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    UILabel *label;
    CGFloat groupedStyleMarginWidth, tableViewWidth;
    UIFont *labelFont = [UIFont boldSystemFontOfSize:17.0]; // Set to whatever you like
    NSString *labelText = @"Test String";

    // Calculate the margin between the cell frame and the tableView
    // frame in a grouped table view style.
    tableViewWidth = tableView.frame.size.width;
    if (tableView.style == UITableViewStyleGrouped) {
        if (tableViewWidth > 20)
            groupedStyleMarginWidth = (tableViewWidth < 400) ? 10 : MAX(31, MIN(45, tableViewWidth*0.06));
        else
            groupedStyleMarginWidth = tableViewWidth - 10;
    }
    else
        groupedStyleMarginWidth = 0.0;

    if (cell == nil) {
        CGRect tableViewRect;
        CGRect labelRect;
        CGFloat x, y, w, h, labelMargin;

        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

        // Retrieve the rect of the table view.
        tableViewRect = [tableView rectForRowAtIndexPath:indexPath];

        // Set whatever margin around the label you prefer.
        labelMargin = 10;

        // Determine rect values for the label.
        x = tableRect.origin.x + labelMargin;

        // Calculate width of label
        w = tableRect.size.width - (groupedStyleMargin * 2) - (labelMargin * 2);

        // Calculate height of table based on font set earlier.
        h = [labelText sizeWithFont:font].height;

        // Calculate y position for the label text baseline to center
        // vertically within the cell.
        y = (tableRect.origin.y / 2) - (h / 4);

        labelRect = CGRectMake(x, y, w, h);

        label = [[UILabel alloc] initWithFrame:labelRect];
        label.text = labelText;
        label.tag = 0;
        [cell.contentView addSubview:stepLabel];
        [label release];
    }
    else {
        label = (UILabel *)[cell viewWithTag:0];
    }
1 голос
/ 16 июля 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...