2013-03-20 10 views
6

Mam niestandardową (podklasowaną) UITableViewCell, która zawiera kilka UILabeli, UIButton i NSBlock jako właściwości. Ta podklasa nazywa się ExploreCell. Dwie z właściwości to UILabels i mają odpowiednio nazwy: waitLabel i lastUpdateLabel.Aktualizacja ramki UITableViewCell subview nie ma żadnego efektu

Gdy zawartość jest zerowa lub jest pusta, tj. @"", muszę przesunąć pionowo w dół (na osi Y) o 1 0 pikseli wartość waitLabel. Robię to, sprawdzając niektóre obiekty w NSDictionary, jak pokazano w poniższym kodzie, który umieściłem w metodzie -tableView:cellForRowAtIndexPath:.

CGRect frame = cell.waitLabel.frame; 

if ([[venue allKeys] containsObject:@"wait_times"] && ([[venue objectForKey:@"wait_times"] count] > 0)) { 

    frame.origin.y = 43; 

} 

else { 
    frame.origin.y = 53; 
} 

[cell.waitLabel setFrame:frame]; 

Jednak ten kod z przerwami działa, a próba połączenia z numerem -setNeedsLayout nadal nie działa. Mam tu na myśli to, że po przewinięciu kilka razy jedna lub dwie komórki, które pasują do kryteriów przesunięcia początku komórki do 10 pikseli, mają zmienioną ramkę waitLabel.

Proszę, możesz mi powiedzieć, dlaczego tak się dzieje i jak można to naprawić.

+0

Gdzie umieściłeś ten kod? – Uby

+0

-cellForRow .... –

+0

Czy używasz automatycznego układu? – rdelmar

Odpowiedz

12

To wygląda na problem z automatycznym układem. Jeśli nie wyłączyłeś go wyraźnie, oznacza to, że jest włączony. Powinieneś wykonać ujście ograniczenia do górnej (lub dolnej) komórki i zmienić stałą tego ograniczenia w kodzie zamiast ustawiania ramek. Według filmów WWDC 2012, nie powinieneś mieć żadnych setFrame: wiadomości w kodzie, jeśli używasz automatycznego układu.

0

Czy próbowałeś działa

[CATransaction flush]; 
[CATransaction begin]; 

na głównym wątku po aktualizacji tych wartości?

+0

To nie działa, a ja nie chcę używać hacky próbującej obejść ten problem. –

+0

Och, właśnie widziałem, gdzie to robisz. Po prostu nie mogę wiedzieć, dlaczego tam nie działa. Szybkie czytanie sprawiło, że chodziło o wykonywanie czynności na niewłaściwej nici. –

-3

Musisz użyć [tableView beginUpdates] + [tableView endUpdates], gdy zmieniasz układ w którejkolwiek z twoich komórek i chcesz, aby były natychmiast widoczne.

-(void)someMethod 
{ 
    [tableView beginUpdates]; 
    // your code: 
    CGRect frame = cell.waitLabel.frame; 

    if ([[venue allKeys] containsObject:@"wait_times"] && ([[venue objectForKey:@"wait_times"] count] > 0)) 
    { 

     frame.origin.y = 43; 

    } 
    else { 
     frame.origin.y = 53; 
    } 
    [cell.waitLabel setFrame:frame]; 

    [tableView endUpdates]; 
} 

Upewnij się, że [tableView beginUpdates] i [tableView endUpdates] zawsze są ze sobą powiązane.

+0

To jest nieprawidłowe użycie metod -beginUpdates i -endUpdates. Są przeznaczone specjalnie do zarządzania wstawkami wsadowymi, aktualizacjami i usuwaniem wierszy. –

+0

@max_ Miałem tę samą funkcję w komórkach, w której miałem 3 etykiety, a 2 z nich były przesunięte i wyblakłe w zależności od wartości boolowskiej. Dodałem beginUpdates i endUpdates do mojego kodu i zadziałało. Może dlatego, że masz niestandardowy UITableViewCell – AzaFromKaza

+0

_max ma rację - zła praktyka – AlexeyVMP

Powiązane problemy