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

Выравнивание ярлыков в UITableViewCell

Я использую UITableView с ячейками, созданными с помощью UITableViewCellStyleSubtitle. Каждая высота ячейки динамически регулируется с помощью

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

метод делегата.

Проблема, которую вы можете видеть на картинке

(note: обновленное изображение)

http://img.skitch.com/20090715-g7srxgee2d7fhi5rab2wufrdgm.png

Как настроить выравнивание textLabel и detailTextLabel в верхней части ячейки? (Я действительно не хочу этого делать, подклассифицируя UITableViewCell и переопределяя layoutSubviews)

Thanx

4b9b3361

Ответ 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;

Если это работает, это немного легче, чем подклассификация ячейки. Я не пробовал, хотя.