2011-06-29 12 views
34

jestem dostosowanie stanu Fragment widok sterownika, po prostu zanim zostanie wciśnięty na navigationController:UIScrollView dostosowuje contentOffset gdy contentSize zmienia

[self.detailViewController detailsForObject:someObject]; 
[self.navigationController pushViewController:self.detailViewController 
            animated:YES]; 

W DetailViewController Scrollview zamieszkuje. Których zawartość zmianie rozmiaru na podstawie przekazany obiektu:

- (void)detailsForObject:(id)someObject { 
    // set some textView's content here 
    self.contentView.frame = <rect with new calculated size>; 

    self.scrollView.contentSize = self.contentView.frame.size; 
    self.scrollView.contentOffset = CGPointZero; 
} 

Teraz to wszystko działa, ale Scrollview reguluje to contentOffset podczas tego navigationController jest wsuwany w animacji. Wartość contentOffset zostanie ustawiona na różnicę między ostatnią wielkością zawartości i nową wartością obliczoną. Oznacza to, że za drugim razem, gdy otworzysz szczegóły, szczegóły zostaną przewinięte do jakiejś niepożądanej lokalizacji. Chociaż ustawiam jawnie contentOffset na CGPointZero.

Zauważyłem, że zerowanie contentOffset w - viewWillAppear nie ma żadnego efektu. Najlepszym mogę wymyślić resetuje contentOffset w viewDidAppear, powodujący zauważalny w górę iw dół o treści:

- (void)viewDidAppear:(BOOL)animated { 
    self.scrollView.contentOffset = CGPointZero; 
} 

Czy istnieje sposób, aby zapobiec UIScrollView z dostosowując jego contentOffset gdy jego contentSize się zmieniło?

+0

Dlaczego dostosowujesz przesunięcie treści w bloku animacji? Pomiń treści CATransaction, więc nie animuje. Wtedy nie będzie wyglądał na wzburzony. – Andrew

+0

Usunięcie rzeczy CATransaction rzeczywiście niczego nie zmienia, więc jest usuwane. – Berik

+0

Czy na pewno wywoływana jest metoda viewDidAppear? Ustawiłbym w nim punkt przerwania lub instrukcję NSLog. Czy próbowałeś zmienić kolejność połączeń, tj. Ustawić szczegółyForObject po naciśnięciu? – Andrew

Odpowiedz

57

występuje, gdy naciska UIViewController zawierający UIScrollView stosując UINavigationController.

iOS 7

Rozwiązanie 1 (Code)

Ustaw @property(nonatomic, assign) BOOL automaticallyAdjustsScrollViewInsets do NO.

Roztwór 2 (ujęć)

Odznacz Adjust Scroll View Insets

Adjust Scroll View Insets

iOS 6

Roztwór (Code)

Ustaw właściwość UIScrollView 's: contentOffset i contentInset w viewWillLayoutSubviews. Przykładowy kod:

- (void)viewWillLayoutSubviews{ 
    [super viewWillLayoutSubviews]; 
    self.scrollView.contentOffset = CGPointZero; 
    self.scrollView.contentInset = UIEdgeInsetsZero; 
} 
+1

To nowy sposób rozwiązania problemu. Jest bardziej schludny niż resetowanie contentSize. – Berik

+3

Znakomita odpowiedź. Dziękujemy za opublikowanie różnic w iOS 7, a nawet w celu objaśnienia zdjęć. Wspaniały! – Marchy

+4

DZIĘKI !!! przez ostatnie kilka godzin nadrabiam to szczęście – user2527666

0

Czy Twój scrollView jest widokiem głównym narzędzia DetailViewController? Jeśli tak, spróbuj owinąć scrollView w zwykły plik UIView i uczynić go drugim głównym widokiem elementu DetailViewController. Ponieważ UIView s nie mają właściwości contentOffset, są odporne na korekty przesunięcia zawartości dokonane przez kontroler nawigacyjny (ze względu na pasek nawigacji itp.).

+1

Widok scrollView nie jest widokiem głównym narzędzia DetailViewController. self.scrollView jest powiązany z UIScrollView, który znajduje się w widoku głównym DetailViewController. – Berik

14

Przyczyna tego problemu pozostaje niejasna, chociaż znalazłem rozwiązanie. Resetując rozmiar treści i przesunięcia przed ich dostosowania The UIScrollView nie będzie animować:

- (void)detailsForObject:(id)someObject { 
    // These 2 lines solve the issue: 
    self.scrollView.contentSize = CGSizeZero; 
    self.scrollView.contentOffset = CGPointZero; 

    // set some textView's content here 
    self.contentView.frame = <rect with new calculated size>; 

    self.scrollView.contentSize = self.contentView.frame.size; 
    self.scrollView.contentOffset = CGPointZero; 
} 
0

doświadczyłem problemu, a dla konkretnego przypadku - nie dopasować rozmiar - Kiedyś następujące:

float position = 100.0;//for example 

SmallScroll.center = CGPointMake(position + SmallScroll.frame.size.width/2.0, SmallScroll.center.y); 

samo będzie działać z y: anotherPosition + SmallScroll.frame.size.height/2.0

Więc jeśli nie ma potrzeby, aby zmienić rozmiar, jest to szybkie i bezbolesne rozwiązanie.

2

Miałem ten sam problem z widokiem UIScroll, gdzie problem został spowodowany przez nie ustawienie contentSize. Po ustawieniu contentSize na liczbę elementów ten problem został rozwiązany.

self.headerScrollView.mainScrollview.contentSize = CGSizeMake(320 * self.sortedMaterial.count, 0); 
Powiązane problemy