9

Oto film z nim dzieje:Dlaczego, gdy zmieniam obraz UIImageView podczas przesuwania komórki, cały widok jest resetowany na sekundę?

http://cl.ly/3V0D3U1m3w0E

Zasadniczo, jeśli mogę zmienić właściwości obrazu UIImageView (The X), a ja jestem panoramowanie przynosi wszystkie kontrole w widoku z powrotem do ich pierwotnego , niezaplanowana pozycja. (Oni wszystko osadzone w UIView więc mogę „Pan komórkę”, natomiast UIImageViews są poza widokiem i niezależne.)

Gdybym nie zmieniają obraz:

http://cl.ly/3T1N1G33320G

Dla rekordu zmieniam obraz, gdy użytkownik patrzy na określoną ilość, wierzę 80 punktów.

Oto kod:

// Only allow the cell to be moved 100 pixels left or right 
if (xPos <= 100 && xPos >= -100) { 
    // Move our cell to the xPos we defined 
    CGRect slidingViewFrame = self.slidingView.frame; 
    slidingViewFrame.origin = CGPointMake(xPos - 100, 0); 
    self.slidingView.frame = slidingViewFrame; 

    if (xPos >= 80) { 
     if (_removeIconIsActive == NO) { 
      // Change remove icon to a red, active state and animate the change 
      self.removeIconImageView.image = [UIImage imageNamed:@"remove-icon-active.png"]; 

      _removeIconIsActive = YES; 
     } 

     CGRect removeIconFrame = self.removeIconImageView.frame; 
     removeIconFrame.origin = CGPointMake(40, 35); 
     self.removeIconImageView.frame = removeIconFrame; 
    } 
} 

Widoki są ustawione w serii ujęć, ale ruch i manipulacja jest wszystko zrobione w kodzie.

Oto układ storyboard:

enter image description here

A oto pełna metoda, która obsługuje panoramowanie komórkowy: https://gist.github.com/anonymous/c51c7cb2997c89094f08

+0

Proponuję wkleić więcej kodu. – sunkehappy

+0

Dodałem układ storyboardów i cały przesuwany kod komórki, nie wiem, co dodać. –

+0

Proponuję umieścić twój nie-poufny kod w nowym projekcie i umieścić go na GitHub. Poprzez wklejony kod nie mogę znaleźć problemu i myślę, że kod nie jest kompletny. – sunkehappy

Odpowiedz

6

Jeśli używasz automatyczny układ, który nie powinien być modyfikujący właściwości ramki w ogóle . Ramka jest wynikiem zastosowania ograniczeń układu, a nie właściwości "zapisu".

Przypuszczam, że będziesz mieć ograniczenie ustawiające pozycję x twoich widoków. Utwórz IBOutlet dla tego ograniczenia, a zamiast modyfikować frame, zmień właściwość ograniczenia. Następnie wywołaj widok layoutIfNeeded.

Nie widząc więcej o swoich poglądów, ograniczeń i wylotów, nie mogę dać wam kod końcowy, ale będzie w końcu z czegoś takiego:

self.leftConstraint.constant = xPos - 100.f; 
[self.slidingView setNeedsUpdateConstraints]; 
[self.slidingView layoutIfNeeded]; 

Moja interpretacja tego, co się dzieje, jest to, że ustawienie zmian graficznych nieodłączny rozmiar widoku obrazu, który powoduje, że ograniczenia ponownie się przeliczają, przywracając wszystko do pozycji wyjściowej. Jak tylko przesuniesz kolejny piksel, ponownie włączy się i ponownie wygrywa własność frame.

Mam nadzieję, że to pomaga.

+0

Oprócz tego, że w scenorysie jest zaznaczony układ automatyczny, nie używam * go * nigdzie. Czy to nadal obowiązuje? –

+0

Oto projekt rozebrany do zaledwie możliwości dodania tekstu (który da komórki do interakcji) za pomocą +. Następnie możesz przesunąć komórki i zobaczyć problem. Przesunięcie w prawo pokazuje problem ze zmianą. Przesunięcie w lewo pokazuje, że brak problemu. http://cl.ly/2g3X3O083i3l –

+0

Twoja komórka oczywiście pokazuje ograniczenia w swoim Xib, więc nawet jeśli nie używasz, działają. Pobrałem Twój projekt, wyłączyłem Auto Layout dla storyboardu (pierwsza "zakładka" prawego panelu) i przetestowałem gest slajdu. Nie widzę flesza, który pokazujesz w swoim filmie. Oczywiście cały twój interfejs jest zepsuty, ponieważ zaprojektowałeś go z Auto Layout w Interface Builder. Tak więc albo korzystasz z Auto Layout do przenoszenia rzeczy, albo będziesz musiał przerobić kompletny interfejs użytkownika. – yonosoytu

Powiązane problemy