Получение фрейма UITableViewCell

я разочаровал себя этим вопросом в течение нескольких дней. Я пытаюсь добавить UILabel в UITableViewCell. Я хочу, чтобы UILabel охватывал всю ширину ячейки, минус 5 или 10 с правой и левой сторон для взглядов. Моя проблема заключается в программном определении размера фрейма ячейки, в который нужно поместить метку. Независимо от того, какой UITableViewStyle я использую, ячейка.contentVew.рамка.размер.значение 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).

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

EDIT для получения дополнительной информации:

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

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

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

2 ответов


Я определил свой собственный ответ, и я надеюсь, что это поможет любому, кто столкнулся с той же проблемой. Расчет поля сгруппированного tableView, который я нашел на этот ответ 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];
    }

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