Изменение размера UILabel в UITableViewCell - PullRequest
0 голосов
/ 01 декабря 2011

Я использую этот код для вывода tableView с UILabels, которые копируют внешний вид столбцов.

В настоящее время есть 2 метки, но я добавляю третью, поэтому мне нужно сделать их немного менее широкимитак что все 3 могут уместиться.

Я закомментировал 2 строки, которые добавляют 3-й «столбец», в котором будет отображаться текст имени пользователя.

Как настроить код так, чтобы я мог уместить 3 столбцавместо 2 в UITableView.

enter image description here

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        NSString *MyIdentifier = [NSString stringWithFormat:@"AuditGridCell %i", indexPath.row];
        GridTableViewCell *cell = (GridTableViewCell *)[tableView dequeueReusableCellWithIdentifier:MyIdentifier];
        if (cell == nil) {
            cell = [[[GridTableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];
            [(GridTableViewCell *)cell clearColumns];
        }

        int is_row_bold = 0;
        NSMutableArray *values = [[NSMutableArray alloc] init];
        float sizes[10] = {CELL_CONTENT_WIDTH, 250.0, 100.0, 125.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0};

        if ([self interfaceOrientation] == UIInterfaceOrientationPortrait || 
            [self interfaceOrientation] == UIInterfaceOrientationPortraitUpsideDown) {
            sizes[0] = CELL_CONTENT_WIDTH_PORTRAIT;
            sizes[1] = 200.0;
        }

        float sum_total = 0.0;
        if (1) {
            int spacer_width = 5;
            UILabel *label = [[[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, spacer_width, tableView.rowHeight)] autorelease];
            [cell.contentView addSubview:label];
            sum_total += spacer_width;
        }   

        if (0 == indexPath.row) {
            is_row_bold = 1;
    //        [values addObject:@"Username"];
            [values addObject:@"Description"];
            [values addObject:@"Date"];
        } else {
            int index = indexPath.row - 1;
   //       [values addObject:[[self.auditRecords objectAtIndex:index] valueForKey:@"username"]];
            [values addObject:[[self.auditRecords objectAtIndex:index] valueForKey:@"description"]];
            [values addObject:[[self.auditRecords objectAtIndex:index] valueForKey:@"date"]];
        }

        for (int it=0; it < [values count]; ++it) {
            UILabel *label = [[[UILabel alloc] initWithFrame:CGRectMake(sum_total, 0.0, sizes[it], tableView.rowHeight)] autorelease];
            sum_total += sizes[it];
            [(GridTableViewCell*)cell addColumn:sizes[it]];
            label.text = [values objectAtIndex:it];

            [cell.contentView addSubview:label];
        }
        [values release];

        return cell;
    }

1 Ответ

0 голосов
/ 01 декабря 2011

Вам нужно будет изменить свой стиль кодирования, когда вы работаете с cellForRowAtIndexPath.Хотя ваша реализация с циклом for делает его простым и приятным, на самом деле, просто добавить значения в cell.contentView без итерации намного проще.Я бы посоветовал вам создать три поля UILabel, например, label1, label2 и label3.И вы можете предоставить им текст для каждого index path и, наконец, добавить их в качестве подпредставления к cell.contentView.

Это действительно просто, и вы сможете увидеть 3 метки в каждой строке.

Примечание. При использовании этого метода вам необходимо будет точно установить размер кадра 3 UILabels, чтобы не мешать внешнему виду.

A ЛучшеПодход:

Вышеприведенная реализация является самой простой, но имеет проблему с cell reusability, и если вы прокрутите эту настройку вверх и вниз, вы увидите, что все UILabels перезаписаны и перепутанывесь вид.Эта проблема неизбежно возникает ~, если у вас нет подходящего представления, которое меньше текущего представления, и у вас нет представления unscrollable.

Решение:

Создайте подкласс UITableViewCell и создайте свой собственный CustomUITableViewCell с 3 UILabels, встроенным в него, и используйте его для реализации tableView с reusability.Вам нужно будет переопределить метод layoutSubviews.

- (void)layoutSubviews {

// In this example we will never be editing, but this illustrates the appropriate pattern
[self.contentView addSubview:self.label1];
[self.contentView addSubview:self.label2];
[self.contentView addSubview:self.label3];
[super layoutSubviews];

}

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

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