2013-04-02 9 views
6

I posypaneDlaczego self.frame i self.contentView.frame często różnią się dla UITableViewCell?

NSAssert(abs(self.frame.size.height-self.contentView.frame.size.height)<=1,@"Should be the same"); 

w różnych miejscach podczas tworzenia UITableViewCell do powrotu.

Wynik często jest różny. Czasami o 1 piksel, czasami o 2.

Zastanawiam się, jaki jest problem? Czy jest coś w cellForRowAtIndexPath, co czyni je innymi?

Zaczynają to samo. Nie ma edycji itp

Spójrz na ten prosty snipet

BGDetailTableViewCell * cell= (BGDetailTableViewCell*)[tableView dequeueReusableCellWithIdentifier:[BGDetailTableViewCell reuseIdentifier]]; 

if (cell==nil) 
{ 
    cell = [[BGDetailTableViewCell alloc]init]; 
} 
else 
{ 
    NSAssert(abs(cell.frame.size.height-cell.contentView.frame.size.height)<=1,@"Should be the same"); //Sometimes this fail 
} 

NSOrderedSet *Reviews = [self.businessDetailed mutableOrderedSetValueForKey:footer.relationshipKey]; 
Review * theReview = [Reviews objectAtIndex:row]; 
cell.theReview = theReview; 
NSAssert(abs(cell.frame.size.height-cell.contentView.frame.size.height)<=1,@"Should be the same");//This one never fail right before returning cell 
return cell; 



`NSAssert(abs(cell.frame.size.height-cell.contentView.frame.size.height)<=1,@"Should be the same")`; never fails right before returning the cell. 

Jednakże nie po ja dequeue komórka czasami ostatni.

Jest to wynik

(lldb) po cell 
$0 = 0x0c0f0ae0 <BGDetailTableViewCell: 0xc0f0ae0; baseClass = UITableViewCell; frame = (0 424; 320 91); hidden = YES; autoresize = W; userInteractionEnabled = NO; layer = <CALayer: 0xc01e800>> 
(lldb) po cell.contentView 
$1 = 0x0c086080 <UITableViewCellContentView: 0xc086080; frame = (10 1; 300 89); gestureRecognizers = <NSArray: 0xc0c7ee0>; layer = <CALayer: 0xc0ebbf0>> 

Przy okazji tableView jest w trybie zgrupowane. Myślę, że ma to coś wspólnego z tym.

Odpowiedz

4

Dwa prostokąty są w różnych układach współrzędnych i niekoniecznie będą pasować.

cell.frame odnosi się do komórki rect w układzie współrzędnych superview (cell.superview). Superview komórki to UITableView. Ramka komórki będzie manipulowana przez widok tabeli w celu prawidłowego jej ułożenia. Obejmuje to również modyfikację wysokości, aby dopasować jej właściwość rowHeight lub wartość zwróconą przez metodę delegowania tableView:heightForRowAtIndexPath:.

Komórka jest "wewnątrz" komórki. To superview to sama komórka, która ma swój lokalny układ współrzędnych dla swoich subviews. Nie są one manipulowane przez tableView, ale przez ograniczenia określone przez komórkę (np. Podklasę komórki). Twoja podklasa może implementować layoutSubviews, aby zmienić rozmiar contentView w wybrany sposób.

Jeśli chcesz, aby zapewnić contentView dopasowuje wysokość (i granic) z celi, w UITableViewCell podklasy, wdrożyć layoutSubviews tak:

-(void)layoutSubviews 
{ 
    self.contentView.frame = self.bounds; 
} 

można dokonywać żadnych modyfikacji w ramie contentView że chcieć, ale należy wziąć pod uwagę, że należy je wykonać w odniesieniu do lokalnego układu współrzędnych, używając do tego celu bounds supervisora ​​zamiast frame.

+0

Mark, czy mógłbyś wyjaśnić, dlaczego szerokość komórki i zawartość komórki nie są takie same? –

Powiązane problemy