2010-03-29 10 views
105

Pracuję nad tym przez około 2 dni, więc pomyślałem, że podzielę się z tobą moimi informacjami.Jak ustawić szerokość komórki w UITableView w zgrupowanym stylu?

Pytanie brzmi: Czy można zmniejszyć szerokość komórki w zgrupowanym widoku UITableView?

Odpowiedź brzmi: Nie

Ale istnieją dwa sposoby, można obejść ten problem.

Rozwiązanie nr 1: cieńsze stół Jest możliwe, aby zmienić klatkę Tableview, tak że tabela będzie mniejsza. Spowoduje to, że UITableView będzie renderować komórkę w środku ze zmniejszoną szerokością.

Rozwiązaniem może to wyglądać tak:

-(void)viewWillAppear:(BOOL)animated 
{ 
    CGFloat tableBorderLeft = 20; 
    CGFloat tableBorderRight = 20; 

    CGRect tableRect = self.view.frame; 
    tableRect.origin.x += tableBorderLeft; // make the table begin a few pixels right from its origin 
    tableRect.size.width -= tableBorderLeft + tableBorderRight; // reduce the width of the table 
    tableView.frame = tableRect; 
} 

Rozwiązanie nr 2: posiadanie komórki świadczone przez obrazy

Takie rozwiązanie opisane jest tutaj: http://cocoawithlove.com/2009/04/easy-custom-uitableview-drawing.html

Mam nadzieję, że ta informacja jest dla ciebie pomocny. Zajęło mi to około 2 dni, aby spróbować wielu możliwości. To właśnie zostało.

+3

Myślę, że powinno to zostać ustawione jako pytanie z drugą linią ("Pytanie brzmi: ..."), następnie rozwiązanie nr 1 i rozwiązanie nr 2 opublikowane jako dwie oddzielne odpowiedzi, z jedną z nich są akceptowane. Następnie, jeśli inni użytkownicy dodają własne odpowiedzi, a jeden z nich staje się lepszy, zaakceptowaną odpowiedź można później zmienić. – GeneralMike

Odpowiedz

223

lepsze i czystsze sposobem osiągnięcia tego celu jest instacji UITableViewCell i przesłanianie jego -setFrame: metoda tak:

- (void)setFrame:(CGRect)frame { 
    frame.origin.x += inset; 
    frame.size.width -= 2 * inset; 
    [super setFrame:frame]; 
} 

Dlaczego lepiej? Ponieważ pozostałe dwa są gorsze.

  1. Regulacja szerokości w widoku tabeli -viewWillAppear:

    Przede wszystkim jest ono zawodne The Superview lub rodzic widok sterownik może regulować widoku tabeli ramkę dalej po -viewWillAppear: jest tzw. Oczywiście możesz podklasować i zastąpić -setFrame: dla swojego UITableView, tak jak to, co robię tutaj dla UITableViewCells. Jednak podklasowanie UITableViewCells jest bardzo powszechne, lekkie i sposobem Apple.

    Po drugie, jeśli twój UITableView ma widok tła, nie chcesz, aby jego widok w tle był zawężony. Utrzymywanie szerokości tła podczas zawężania Szerokość UITableView nie jest trywialna, nie wspominając o tym, że rozszerzanie subviews poza jej superwizytę nie jest zbyt eleganckim zadaniem.

  2. renderowania komórek Niestandardowe udawać węższą szerokość

    Aby to zrobić, trzeba przygotować specjalne obrazy tła z marginesów poziomych i trzeba subviews układ komórek siebie, aby pomieścić marginesy. W porównaniu, jeśli po prostu dostosujesz szerokość całej komórki, autouzupełnianie zrobi wszystko za Ciebie.

+2

to jest ładne i eleganckie rozwiązanie, zrobiłem to w kategorii :) Zauważyłem również, że im bardziej przezroczyste obiekty, tym więcej obciążenia cpu :) –

+11

@misterkoz - słowo ostrzeżenia: niektóre kontrolki iOS (UIDatePicker for definite) używają wewnętrznie UITableViewCells i łamią się, jeśli zaimplementujesz to w kategorii. – Clafou

+0

Zacząłem szaleć, zmieniając rozmiar statycznego zgrupowanego widoku tabeli tak, aby pasował do tła! Dziękuję bardzo! – Claus

-6

W pliku .h dodać delegata „UITableViewDataSource”

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return size; 
} 
+4

Chce ustawić szerokość, a nie wysokość –

+0

oh hoo. sry za niedogodności. –

+0

źle rozumiesz pytanie, a ty odpowiadasz wysokością i wiesz, co działa dla mnie, ponieważ szukam wzrostu nie dla szerokości. Dziękuję za odpowiedź: – Pooja

9

Jeśli nic nie działa, możesz spróbować tej

Dodać kolor tła komórki jako jasny kolor, a następnie umieścić obraz w komórce z wymaganym rozmiarem. Jeśli chcesz wyświetlić tekst na tej komórce, umieść etykietę nad obrazem. Nie zapomnij ustawić koloru tła etykiety, aby również wyczyścić kolor.

8

Znalazłem przyjęte rozwiązanie nie działa po obrocie. Aby osiągnąć UITableViewCells ze stałych szerokościach & elastycznych marginesu prostu dostosowany do powyższego rozwiązania następujące:

- (void)setFrame:(CGRect)frame { 

    if (self.superview) { 
     float cellWidth = 500.0; 
     frame.origin.x = (self.superview.frame.size.width - cellWidth)/2; 
     frame.size.width = cellWidth; 
    } 

    [super setFrame:frame]; 
} 

Sposób jest wywoływana w przypadku, gdy urządzenie obraca się, tak że komórki zawsze wycentrowany.

-2

zrobić go w

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell; 
    CGFloat tableBorderLeft = self.view.frame.origin.x + 10; 
    CGFloat tableBorderRight = self.view.frame.size.width - 20; 

    CGRect tableRect = self.view.frame; 
    tableRect.origin.x = tableBorderLeft; 
    tableRect.size.width = tableBorderRight; 
    tableView.frame = tableRect; 
} 

I to pracował dla mnie

11

Aby to zrobić w Swift, która nie zapewnia metody ustawiania zmiennych, musisz zastąpić setter dla frame. Opublikowany pierwotnie (przynajmniej gdzie znalazłem go) here

override var frame: CGRect { 
    get { 
     return super.frame 
    } 
    set (newFrame) { 
     let inset: CGFloat = 15 
     var frame = newFrame 
     frame.origin.x += inset 
     frame.size.width -= 2 * inset 
     super.frame = frame 
    } 
} 
0

Jest to metoda, która jest wywoływana, gdy ekran jest obrócony: viewWillTransitionToSize

To gdzie należy zmienić rozmiar ramki. Zobacz przykład. Zmień współrzędne ramki, tak jak potrzebujesz.

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator 
{ 
    [coordinator animateAlongsideTransition:nil completion:^(id<UIViewControllerTransitionCoordinatorContext> context) 
    { 
     int x = 0; 
     int y = 0; 
     self.tableView.frame = CGRectMake(x, y, 320, self.tableView.frame.size.height); 
    }]; 
}