Получение фрейма 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];
}