iOS 7-navigationController ustawia contentInset i ContentOffset mojego UIScrollView

Mam UIScrollView (właściwie UICollectionView, ale to chyba nie ma znaczenia). Gdy pojawi się w systemie IOS 7, Kontroler nawigacyjny ustawia jego contentInset i contentOffset na wartości, których nie chcę. Wydaje się, że próbuje dostosować pasek stanu i pasek nawigacji. Wolałabym zostawić ich samych. Naprawiłem to, nadpisując metody getter i setter dla contentInset i contentOffset, z flagą, która mówi obiektowi, czy powinien zaakceptować zestaw. Ale czy jest lepszy sposób?

Author: William Jockusch, 2013-09-20

7 answers

Spróbuj ustawić self.automaticallyAdjustsScrollViewInsets = NO w głównym kontrolerze widoku.

Zostało to wprowadzone w iOS 7, więc możesz chcieć to zawinąć za pomocą sprawdzania wersji iOS, jeśli obsługujesz iOS 6 i poniżej.


Update

Jeśli używasz storyboardów, możesz to zrobić w Kreatorze interfejsów, a także sprawdzając 'Adjust Scroll View Insets' dla wybranego kontrolera.

Tutaj wpisz opis obrazka

 208
Author: KDaker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-08 02:24:21

Miałem podobny problem, po odrzuceniu kontrolera viewController, contentOffset z mojego tableView został zmieniony na (0, -64).

Moje rozwiązanie było trochę dziwne, próbowałem wszystkich innych odpowiedzi, ale nie odniosłem sukcesu, jedyną rzeczą, która naprawiła mój problem było przełączenie pozycji tableView w drzewie kontrolek .xib

Była to pierwsza kontrolka w widoku nadrzędnym w ten sposób:

przed

Przeniosłem tableView zaraz po ImageView i to "przepracowany": {]}

po

Wydaje się, że umieszczenie widoku tabeli na pierwszej pozycji powodowało problem, a przesunięcie widoku tabeli na inną pozycję rozwiązało problem.

P. D. nie używam autoLayout ani storyboardów

Mam nadzieję, że to może komuś pomóc!

 25
Author: Chuy47,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-11 19:33:26

Mam dwa rozwiązania:

1.

self.view = scrollView;

2.

[self.navigationController.toolbar setTranslucent:NO];
 5
Author: amazingthere,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-27 08:19:14

Mam ten sam problem.

  1. Ustawienie self.automaticallyAdjustsScrollViewInsets = NO rozwiązało problem dla niektórych widoków, ale nie wszędzie.

  2. Drugim rozwiązaniem jest ustawienie przesunięcia zawartości tableview/view / scrollview w viewWillLayoutSubviews:

    - (void)viewWillLayoutSubviews {
        //Arrange the view
        CGRect tempViewFrame = self.view.frame;
    
        if (tempViewFrame.origin.y == 64.0f) {
            tempViewFrame.origin.y = 0;
            self.view.frame = tempViewFrame;
        }
    }
    
 2
Author: Savvy iPhone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-25 09:02:24

To wystarczy

- (void)viewDidLoad {

    [super viewDidLoad];

    self.automaticallyAdjustsScrollViewInsets = NO;
 0
Author: Vlad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-22 17:00:12

To rozwiązuje problem w obu przypadkach, gdy:

  1. Wyświetlanie Paska Stanu
  2. Wyświetlanie Paska Stanu + Paska Nawigacji

    override func viewDidLayoutSubviews() {
            NSLog("ORIGIN: \(self.view.frame.origin.y)")
    
        if self.view.frame.origin.y == 0 {
            if let rect = self.navigationController?.navigationBar.frame {
                let y = rect.size.height + rect.origin.y
                self.tableView.contentInset = UIEdgeInsetsMake(y, 0, 0, 0)
            }
        } else if self.view.frame.origin.y == 44 || self.view.frame.origin.y == 64 {
            self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0)
        }
    }
    
 0
Author: Carlos Javier A. Helguero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-04 18:34:48

Inne odpowiedzi mogą zadziałać na ciebie, ale nie zadziałały na mnie. Zadziałało dla mnie Ręczne Ustawienie y Właściwości contentOffset w viewDidLayoutSubviews i viewWillAppear:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    // Set the offset to go below the status bar
    collectionView.contentOffset.y = -UIApplication.shared.statusBarFrame.height
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    // Set the offset to go below the status bar
    collectionView.contentOffset.y = -UIApplication.shared.statusBarFrame.height
}

W moim przypadku, mój kontroler miał widok kolekcji potomnych, który czasami dostałby contentOffset skorygowany, a innym razem nie. Sposób, w jaki go znormalizowałem, polegał na ręcznym dostosowywaniu go za każdym razem. Chciałem, aby zawartość była przesunięta poniżej paska stanu, więc użyłem wysokości paska stanu jako wartości (ujemnej, ponieważ chcę treść do zepchnięcia w dół).

 0
Author: Eric F.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-25 14:51:26