2011-02-09 4 views
8

Jak mogę zwiększyć rozmiar drugiej komórki, aby dopasować ją do tekstu, zamiast skalować tekst? Czy jest to wbudowane w iOS, czy będę musiał wymyślić jakieś domowe rozwiązanie? Jeśli spojrzysz w aplikacji Kontakty na iOS, w polu adresu znajduje się takie pole. Nie mogę jednak znaleźć sposobu na wdrożenie tego.Jak utworzyć wielowierszową komórkę tabeli w systemie iOS?

Table screenshot


Dla każdego, kto chce osiągnąć w przyszłości, oto kod dla mojego rozwiązania:

pliku nagłówka: plik

#define FONT_SIZE 22.0f 
#define CELL_CONTENT_WIDTH 320.0f 
#define CELL_CONTENT_MARGIN 5.0f 

REALIZACJA:

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

    if (indexPath.section == 0 && indexPath.row == 1) { 

     NSString *text = [atmAnnotation address]; 

     CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f); 

     CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap]; 
     NSLog(@"Size for address is Height:%f Width:%f",size.height,size.width); 

     CGFloat height = MAX(size.height, 44.0f); 

     return height + (CELL_CONTENT_MARGIN * 2); 

    } 
    return 44.0f; 
} 

Oto zrzut ekranu z wynikiem:

UITableView fixed

Odpowiedz

5

Niestety, będziesz musiał zaimplementować tę funkcję samodzielnie. Istnieje wiele metod i wywołań zwrotnych, których potrzebujesz, aby obliczyć wysokość wierszy i etykiet. Jeśli potrzebujesz pomocy w rozpoczęciu pracy, mogę zmienić tę odpowiedź, dodając przykładowy kod. W przeciwnym razie jestem pewny, że w SO lub Google znajdziesz kilka powiązanych pytań, które mogą Ci pomóc. Podsumowując, jakkolwiek:

  • Określić wysokość rzędu w metodzie -tableView:heightForRowAtIndexPath:UITableViewDelegate. Prawdopodobnie będziesz potrzebował użyć NSString UIKit Addition methods, aby obliczyć, jak wysoki będzie twój ciąg przy danym rozmiarze czcionki, itp. Zwróć odpowiednią wysokość z tej metody delegatów.
  • Upewnij się, że etykieta (w IB lub skonfigurowana programowo) jest ustawiona tak, aby używała wielu linii. Jeśli ustawisz numberOfLines na 0, etykieta użyje tyle linii, ile potrzeba.
  • W swojej UITableViewDataSource realizacji -tableView:cellForRowAtIndexPath:, musisz użyć tej samej logiki, co poprzednio, aby określić ramkę etykiet. Ustaw żądany tekst, a następnie zmień ramkę tak, aby etykieta była wystarczająco wysoka, aby ledwo pasowała do całego tekstu.
1

Wdrożenie:

- (float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; 

delegata w tabeli. W przypadku różnych wierszy i sekcji w przekazanej ścieżce indexPath należy zwrócić inną wysokość, aby pasowała do etykiety.

Upewnij się, że "dopasuj do kształtu", aby etykieta w IB nie była zaznaczona (właściwość adjustsFontSizeToFitWidth, jeśli została wykonana przy użyciu kodu).

1

Gdzie masz adres jako detailTextLabel, użyj UILabel, który obsługuje tyle linii, ile potrzebujesz, dla adresu, 3 powinno wystarczyć. Wraz z odpowiedzią Paul Bently's powinieneś być dobry.

0

Po prostu wpadłem na ten sam problem. Znalazłem alternatywne rozwiązanie, które nie wymaga tak dużo twardego kodowania i pozwala na modyfikacje etykiety w Konstruktorze interfejsu, która będzie odzwierciedlona w obliczeniach wysokości.

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (indexPath.section == 0 && indexPath.row == 1) { 
     NSString *text = [atmAnnotation address]; 
     UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"]; 

     cell.textLabel.text = text; 
     [cell.textLabel sizeToFit]; 

     CGFloat height = MAX(44, cell.textLabel.bounds.size.height); 

     return height + CELL_CONTENT_MARGIN * 2; 
    } 

    return 44.0f; 
} 

Jedynym minusem jest to, że spowoduje to dodatkowe tymczasowe przydziały UITableViewCell, ale widok tabeli zostanie natychmiast odzyskać je, więc nie sądzę, powinno to być duży problem.