2013-10-16 16 views
5

Mam aplikację na iPhone'a, w której używam UITableView do sformatowania zestawu odpowiedzi tekstowych, po jednym w wierszu. Ustawiłem komórkę w serii ujęć, aby zawierała w niej etykietę i ustawiłem ograniczenie, informując, że etykieta powinna znajdować się 10 punktów od krawędzi komórki. Następnie skonfigurowałem niestandardową podklasę UITableViewCell, ustawiłem komórkę w storybooku na taką klasę i podłączyłem gniazdo.Zawartość UITableViewCell porusza się w pobliżu

Jednak po załadowaniu tabeli widzę tekst w komórce przesuwający się nieco w prawo w pewnych okolicznościach: po wybraniu komórki lub po załadowaniu dodatkowych komórek do tabeli. W rzeczywistości, w tym drugim przypadku, czasami wszystko zostaje przesunięte w prawo, nawet komórki, które już tam były!

Co do cholery się tutaj dzieje? Jedyne zmiany, które wprowadzam w tableView:cellForRowAtIndexPath:, dotyczą tekstu w etykiecie i zawsze go konfiguruję. I usunąłem "Wcięcie podczas edycji" w komórce w serii ujęć.

Odpowiedzi na niektóre z pytań: konfiguruję widok za pomocą scenorysu. Xcode nie zgłasza żadnych niejednoznaczności z ograniczeniami. Również tutaj przed i po to, screeny:

enter image description here enter image description here

+2

czy możesz pokazać nam kod, szczególnie część, w której ustawiasz swoją nsconstraint (czy programujesz ją lub za pomocą scenorysu?) – abbood

+0

możesz również zrzuty ekranu przedstawiać wygląd komórki przed jej przeniesieniem i po przeniesieniu ? – abbood

+0

Czy możesz oddzielić problematyczny widok od kontrolera widoku, umieścić go w nowym projekcie i udostępnić źródło? –

Odpowiedz

1

Domyślam się, że ograniczenia dotyczące etykiet są niejednoznaczne. Dwuznaczność może sprawić, że komponenty interfejsu użytkownika będą przeskakiwać z niewytłumaczalnych powodów. Prawdopodobnie musisz ustawić więcej ograniczeń etykiety, aby zdefiniować jej położenie na obu osiach.

A może wszystko, co musisz zrobić, to ustawić etykietę na "rozmiar, który pasuje do zawartości" (wewnętrzny rozmiar zawartości) w menu Edytora w IB.

+0

Xcode nie zgłasza żadnych niejednoznacznych ograniczeń, ani nie otrzymuję żadnych komunikatów dziennika dotyczących ograniczeń, więc może to nie być prawda. Ustawienie etykiety na wewnętrzny rozmiar treści nie wydaje się mieć sensu, ponieważ każdy wiersz w tabeli będzie miał inny tekst w etykiecie. – dpassage

+0

Xcode nie zgłasza automatycznie niejednoznacznych wiązań. Musisz wywołać hasAmbiguousLayout w swoim widoku. – bilobatum

+0

Gdy etykieta jest ustawiona na swój wewnętrzny rozmiar zawartości, automatycznie dostosowuje swój rozmiar do rozmiaru jego zawartości, tj. Do tekstu. – bilobatum

-1

Jeśli masz niestandardową podklasę UITableViewCell, spróbuj wdrożyć layoutSubviews. Pozwól mi spróbować od początku mojej głowie:

static CGFloat const kLeftMargin = 10.0f; 

- (void) layoutSubviews 
{ 
    [super layoutSubviews]; 

    /* Prepare for processing */ 
    CGSize cellSize = self.bounds.size; 

    /* Change the textLabel frame */ 
    { 
    /* Compute the new label frame */ 
    CGSize labelSize = self.textLabel.bounds.size; 
    CGFloat xCoor = kLeftMargin; 
    CGFloat yCoor = roundf((cellSize.height - labelSize.height)/2.0f); 
    CGRect labelFrame = CGRectMake(xCoor, yCoor, 
            labelSize.width, labelSize.height); 

    /* Set the new label frame */ 
    self.textLabel.frame = labelFrame; 
    } 
} 

Teraz, to nie jest to, co jest zwykle zalecane (ponieważ wiele osób korzysta obrazkowa i śruta), lecz z doświadczenia, jeśli chcesz zrobić niektóre poprawne layouting , implementuj layoutSubviews.

+0

Czy ktoś próbował tego przed zwolnieniem? –

1

Czy dodałeś nową etykietę do UITableViewCell, czy też pracujesz z textLabel, która już w nim istnieje? Jeśli dodałeś nowy, rozważ usunięcie go i zamiast tego użyj istniejącej właściwości textLabel komórki. Jeśli z jakiegoś powodu nie jest to opcja, sprawdź ponownie, czy dodana etykieta znajduje się w treści widoku komórki i że wszystkie ograniczenia są powiązane z widokiem nadrzędnym, a nie z samą komórką.

Ponadto do debugowania można ustawić zawartość komórki na kolor tła na czerwony (cell.contentView.backgroundColor = [UIColor redColor];) - może to dać lepsze wyczucie tego, co się rusza, etykieta lub cały widok .

1

To tylko odgadnięcie bez zobaczenia kodu. Miałem podobny problem raz, gdy aplikacja ponownie wykorzystała istniejącą komórkę, wymiary etykiety były nieprawidłowe. Musiałem więc usunąć starą etykietę w metodzie cellForRowAtIndexPath, zanim dodaję nową etykietę. Oto jak usunąłem starą:

UIView *oldLabel = [cell viewWithTag:3]; 
if (oldLabel != nil) 
{ 
    [oldLabel removeFromSuperview]; 
} 

Potem dodałem nową etykietę tak:

[cell.contentView addSubview:newLabelOrWhatever]; 
1

to może być warto sprawdzić, czy zawartość ciąg nie ma przestrzeń prefiksem na to.Można również zweryfikować faktyczną pozycję etykiety, ustawiając kolor tła.

0

Miałem podobny problem, gdy etykieta poruszałaby się po wybraniu komórki. To była niestandardowa komórka, którą ładowałem z niestandardowej końcówki.

W stalówce nie ustawiłem tła widoku UITableViewCell (nadklasy) do żadnego widoku. Po ustawieniu go (ustawiłem na ContentView) problem został zatrzymany.

Moje ograniczenia związane z automatycznym układem wydają się w porządku i nie sprawiały żadnych problemów, więc zakładam, że naprawił to powyższy problem.

Powiązane problemy