Выравнивание ярлыков в UITableViewCell
Я использую UITableView с ячейками, созданными с помощью UITableViewCellStyleSubtitle. Каждая высота ячейки динамически регулируется с помощью
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
метод делегата.
Проблема, которую вы можете видеть на картинке
(note: обновленное изображение)
http://img.skitch.com/20090715-g7srxgee2d7fhi5rab2wufrdgm.png
Как настроить выравнивание textLabel и detailTextLabel в верхней части ячейки? (Я действительно не хочу этого делать, подклассифицируя UITableViewCell и переопределяя layoutSubviews)
Thanx
Ответы
Ответ 1
Вот еще одно решение без подклассификации ячеек, поэтому оно, безусловно, работает с разными стилями таблиц. (Я не проверял другие решения.) Заголовки заголовков и подробностей объявлены в моем заголовке UITableViewController и уже определены. Они не очень долго, конечно, хорошо в пределах 4000!
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
CGRect frame = [UIScreen mainScreen].bounds;
CGFloat width = frame.size.width;
int section = indexPath.section;
int row = indexPath.row;
NSString *title_string = [title_strings_array objectAtIndex:row];
NSString *detail_string = [detail_strings_array objectAtIndex:row];
CGSize title_size = {0, 0};
CGSize detail_size = {0, 0};
if (title_string && [title_string isEqualToString:@""] == NO ) {
title_size = [title_string sizeWithFont:[UIFont systemFontOfSize:22.0]
constrainedToSize:CGSizeMake(width, 4000)
lineBreakMode:UILineBreakModeWordWrap];
}
if (detail_string && [title_string isEqualToString:@""] == NO ) {
detail_size = [detail_string sizeWithFont:[UIFont systemFontOfSize:18.0]
constrainedToSize:CGSizeMake(width, 4000)
lineBreakMode:UILineBreakModeWordWrap];
}
CGFloat title_height = title_size.height;
CGFloat detail_height = detail_size.height;
CGFloat content_size = title_height + detail_height;
CGFloat height;
switch ( section ) {
case 0:
height = content_size;
break;
//Just in case
default:
height = 44.0;
break;
}
return height;
}
Ответ 2
Хорошо, это стоило мне дня, но я думаю, что понял это. Насколько я могу судить, это, по-видимому, является ошибкой в том, как UITableViewCell кладет textLabel и detailTextLabel. Когда вы устанавливаете высоту строки, она, как представляется, выделяет равную высоту для двух меток, а это означает, что вы получаете именно то поведение, которое видите выше, хотя detailTextLabel требует больше места. Вот две вещи, которые я сделал, чтобы решить проблему. Мне пришлось подклассифицировать UITableViewCell, чтобы исправить его, но это минимальное количество кода.
Сначала убедитесь, что вы правильно вычисляете высоту каждой строки. Поместите этот метод в делегат табличного представления. Замените методы шрифтов на свой собственный:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *cellDetailText = [[self itemForIndexPath: indexPath] detailDescription];
NSString *cellText = [[self itemForIndexPath: indexPath] description];
// The width subtracted from the tableView frame depends on:
// 40.0 for detail accessory
// Width of icon image
// Editing width
// I don't think you can count on the cell being properly laid out here, so you've
// got to hard code it based on the state of the table.
CGSize constraintSize = CGSizeMake(tableView.frame.size.width - 40.0 - 50.0, CGFLOAT_MAX);
CGSize labelSize = [cellText sizeWithFont: [self cellTextLabelFont] constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];
CGSize detailSize = [cellDetailText sizeWithFont: [self cellDetailTextLabelFont] constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];
CGFloat result = MAX(44.0, labelSize.height + detailSize.height + 12.0);
return result;
}
Затем подкласс UITableViewCell и переопределить layoutSubviews:
#import "UITableViewCellFixed.h"
@implementation UITableViewCellFixed
- (void) layoutSubviews {
[super layoutSubviews];
self.textLabel.frame = CGRectMake(self.textLabel.frame.origin.x,
4.0,
self.textLabel.frame.size.width,
self.textLabel.frame.size.height);
self.detailTextLabel.frame = CGRectMake(self.detailTextLabel.frame.origin.x,
8.0 + self.textLabel.frame.size.height,
self.detailTextLabel.frame.size.width,
self.detailTextLabel.frame.size.height);
}
@end
Ответ 3
Однако вы оцениваете свои ячейки, вы должны делать это с помощью различных методов калибровки NSString. Таким образом, вы можете точно определить, насколько высока, чтобы сделать ячейку и избежать пробелов.
Ответ 4
Если окажется, что textLabel и detailTextLabel выложены с использованием авторезистирующих масок, возможно, вы можете сделать это, когда вернете ячейку:
cell.textLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin;
cell.detailTextLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
Если это работает, это немного легче, чем подклассификация ячейки. Я не пробовал, хотя.