2012-05-25 12 views
8

Mam UITableView ładowanie niestandardowego UITableViewCell z pliku XIB. Wszystko działa dobrze, ale mój układ wymaga, aby komórki (wszystkie wewnątrz jednej sekcji) miały odstępy między nimi. Jest szansa, że ​​można to zrobić bez podnoszenia wysokości ROW?Odstęp między komórkami w widoku UITableView z niestandardowym UITableViewCell

jak to jest teraz
how it is now

jak to supossed być
how it's supossed to be

EDIT:
ten sposób kod jest dzisiaj

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 
    return [[self.cards valueForKeyPath:@"cards"] count]; 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    [ccTableView setBackgroundColor:[UIColor clearColor]]; 
    cardsCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cardsCell"]; 

    if(cell == nil){ 
     NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"cardsCell" owner:self options:nil]; 
     cell = [topLevelObjects objectAtIndex:0]; 
    } 

    NSString *nmCard = [[self.cards valueForKeyPath:@"cards.name"] objectAtIndex:indexPath.row]; 
    cell.descCardLabel.text = nmCard; 

    return cell; 
} 
+0

Dlaczego nie chcesz podnieść wysokości wiersza? –

+0

@obuseme w najprostszym przypadku istnieje jeden stan Xib i trzy rzędy (środkowy, górny, dolny), kod będzie dość uwikłany. –

+0

@obuseme Ponadto moja komórka ma obraz tła z 35 wysokością, na którym znajduje się etykieta. Jeśli podniosę wysokość wiersza, układ będzie taki, jak chcę, ale wybór gwintowania będzie działał pod obrazem, w odstępach i nie będę chciał wybierać przypadkowo niewłaściwego wiersza. – gmogames

Odpowiedz

7

Jeśli możesz nie zmienia wysokości komórki, rozwiązaniem jest użycie niewidocznych pośrednich komórek o wymaganej wysokości. Będziesz musiał ponownie przeliczyć indeksy w widoku tabeli i źródło danych w tym przypadku.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 

    static NSString *CELL_ID2 = @"SOME_STUPID_ID2"; 
    // even rows will be invisible 
    if (indexPath.row % 2 == 1) 
    { 
     UITableViewCell * cell2 = [tableView dequeueReusableCellWithIdentifier:CELL_ID2]; 

     if (cell2 == nil) 
     { 
      cell2 = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
              reuseIdentifier:CELL_ID2]; 
      [cell2.contentView setAlpha:0]; 
      [cell2 setUserInteractionEnabled:NO]; // prevent selection and other stuff 
     } 
     return cell2; 
    } 

    [ccTableView setBackgroundColor:[UIColor clearColor]]; 
    cardsCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cardsCell"]; 

    if(cell == nil){ 
     NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"cardsCell" owner:self options:nil]; 
     cell = [topLevelObjects objectAtIndex:0]; 
    } 

    // Use indexPath.row/2 instead of indexPath.row for the visible section to get the correct datasource index (number of rows is increased to add the invisible rows) 
     NSString *nmCard = [[self.cards valueForKeyPath:@"cards.name"] objectAtIndex:(indexPath.row/2)]; 
     cell.descCardLabel.text = nmCard; 

     return cell; 
    } 



- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 

    // two times minus one (invisible at even rows => visibleCount == invisibleCount+1) 
    return [[self.cards valueForKeyPath:@"cards"] count] * 2 - 1; 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (indexPath.row % 2 == 1) 
     return 40; 
    return 162; 
} 

Potrzebny będzie również do przeliczyć indexPath.row dla :didSelectRowAtIndexPath: i innych metod, gdzie jest ona wykorzystywana.

+0

jest szansa na przykład kodu, jak to zrobić? Dodałem mój obecny kod do pytania. dzięki. – gmogames

+0

@Guilherme Mogames zobacz aktualizację –

+1

W rzeczywistości ten jedyny kod spowodował, że wszystkie równe wiersze były puste. Na przykład pierwszy wiersz (komórka 1) zwraca 0, więc zamiast zwracać komórkę z tekstem, zwraca pustą komórkę2. więc dostaję 2 przedmioty w tabeli, ale pierwsza jest pusta. – gmogames

4

Chociaż @ A-Live jest technicznie poprawne, w celu uniknięcia innych kwestii, np: użytkownik zapomni umieścić gdzieś indexPath.row/2, można wykonać następujące czynności (co nie wiąże programowanie):

Powiedzmy na przykład, że twoja wysokość UITableViewCell wynosi zwykle 90 punktów i chcesz mieć 10-punktowy odstęp między komórkami. Spraw, aby Twój UITableViewCell był 100 punktów wysoki i po prostu ustaw puste 10 punktów UITableViewCell jako puste (żadnych obiektów). Następnie kliknij przycisk UITableViewCell w programie budującym interfejs i ustaw kolor backgroundColor na dowolny kolor obszaru odstępu.

Voila! Masz odstęp między każdą komórką przy odrobinie pracy, która jest znacznie łatwiejsza niż programowanie/2 wszędzie!

+0

jak zrobić dolną 10 bez niczego? Właśnie ustawiłem tło komórki na białe – Dejell

36

Jest to całkiem proste rozwiązanie, które znalazłem, jeśli używasz niestandardowych klas uitableviewcell.

W klasie komórek, dodać ten kod.

- (void)setFrame:(CGRect)frame { 
    frame.origin.y += 4; 
    frame.size.height -= 2 * 4; 
    [super setFrame:frame]; 
} 

to daje bufor 4pt w wysokości komórek można umieścić w klasie uitablview której dzwonisz tę komórkę Oczywiście, masz teraz do zrekompensować mniej miejsca w komórce podczas umieszczania etykiet i obrazów, ale działa. Możesz także zrobić to samo na osi X, aby zmniejszyć szerokość komórki. Zrobiłem to w mojej aplikacji, aby wyświetlać obrazy tła za komórkami.

+0

Cool! działa idealnie, niż się spodziewałem! –

+0

Głębokie głosowanie na to rozwiązanie. – lee

+0

Dziękuję, to właśnie szukam :) – Harshad

0

Jeśli szukasz rozwiązania w szybkim tempie, ta odpowiedź od reddit działała idealnie dla mnie.

class CustomTableViewCell: UITableViewCell { 
override var frame: CGRect { 
    get { 
     return super.frame 
    } 
    set (newFrame) { 
     var frame = newFrame 
     frame.origin.y += 4 
     frame.size.height -= 2 * 4 
     super.frame = frame 
    } 
} 
} 
Powiązane problemy