2009-07-11 14 views
22

Jak zmienić rozmiar widoku w odpowiedzi na pasek stanu połączenia z mojego końcówki?Zmiana rozmiaru paska stanu podczas połączenia?

Pomyślałem, że po prostu ustawiam właściwości zmiany rozmiaru, ale nie są one włączone dla głównego UIView.

(Myślę, że moim głównym problemem jest to, że nie wiem, co to wszystko się nazywa, nie mogę znaleźć żadnego odniesienia do paska stanu połączenia w żadnej z dokumentacji, z wyjątkiem sytuacji, gdy mówi o symulatorze . polecenie menu)

Odpowiedz

6

Co robić masz na myśli, kiedy mówisz, że "właściwości zmiany rozmiaru nie są włączone dla głównego UIView"?

Pasek stanu połączenia nie ma żadnego szczególnego oznaczenia i nie sądzę, aby istniały wokół niego interfejsy API lub powiadomienia. Zamiast tego, twoje poglądy powinny być po prostu skonfigurowane, aby prawidłowo autoreizeć.

Spróbuj stworzyć nową aplikację opartą na nawigacji w Xcode i przestudiuj ustawienia autorezyzacji w widoku tabeli w RootViewController.xib. Mamy nadzieję, że zobaczysz różnicę między zestawem Apple a ustawieniami w projekcie.

+0

Prawdopodobnie używam też niewłaściwego terminu. Zasadniczo mam xib z UIView. Wybierając UIView i patrząc na właściwości zmiany rozmiaru, mogę kliknąć połączenia góra/dół i lewo/prawo, ale poziome i pionowe w środku nie odpowiadają kliknięciom. –

+0

Utworzono nowy interfejs UIView na serwerze Xib i mogę nim manipulować. Wydaje się być czymś złym w tym UIView na Xib. Czy poeksperymentuje nieco więcej i oznaczy to jako rozwiązanie, jeśli tak. –

+0

Tak, wygląda na to, że coś jest nie tak z tym UIView. Dzięki. –

16

Szukacie - [UIApplication statusBarFrame], w swojej UIApplicationDelegate, należy wdrożyć tę metodę delegata być powiadomiony kiedy zmiany ramki na pasku stanu jest:

- (void)application:(UIApplication *)application didChangeStatusBarFrame:(CGRect)oldStatusBarFrame 
+1

Mike, czy możesz wyjaśnić: Czy to oznacza, że ​​muszę ręcznie zmienić rozmiar moich widoków w kodzie? Łapanie tchu! –

+1

Nie widzę powodu, dla którego właściwości autorezoryzowania widoku są poprawnie ustawione. Ale tak, pisanie kodu - co za okropna niedogodność. :-) –

+0

Zaznaczenie drugiego zaakceptowano, ponieważ wskazał, że to, co próbowałem zrobić * powinno * zadziałało jako pierwsze, ale dziękuję bardzo. :) –

3

W przypadku widoków, takich jak UITableView, zwykle trzeba zmienić wysokość komórki tabeli, a nie ma innego sposobu, aby to zrobić, z wyjątkiem implementacji aplikacji : didChangeStatusBarFrame:. Ale to nie jest biggie i możesz ustawić wysokość wiersza na wartości niecałkowite, jeśli potrzebujesz.

+0

Oprócz tej aplikacji: didChangeStatusBarFrame: i towarzyszące powiadomienie nigdy nie jest wysyłane dla prostej zmiany ramki statusu. Wypróbuj :-) –

+0

Zauważyłem, że gdy już go wypróbowałem. Jak więc poradzić sobie ze zmianą rozmiaru ekranu? Interfejs mojej aplikacji zostaje zsunięty, ale częściowo zostaje zasłonięty. –

0

Rozwiązaniem jest zapewnienie dokonaniu klucz okno:

[window makeKeyAndVisible]; 

Jeśli tego nie zrobisz, że subview nie zostanie zmieniony automatycznie, ale nie istnieją żadne inne objawy, o ile wiem.

1

Wystąpił ten sam problem. To, co zrobiłem, to było to.

  1. Otwórz plik xib w IB
  2. Wszystkie elementy interfejsu są domyślnie załączony przenieść wraz ze z góry i pokazany w nieruchomości „autosizing” w „Inspector size”. Tak więc, dla elementów interfejsu użytkownika u dołu ekranu, usuń link z góry i zamiast tego utwórz link od dołu. Pozostaw wszystkie pozostałe, jakie są.
  3. Problem rozwiązany !!!

Mam nadzieję, że było jasne.

+0

Teraz mój widok nie jest widoczny, jeśli utworzę link do dołu. –

+0

Nie, to nie działa dla mnie –

24

System iOS wywoła metodę viewTontroller viewWillLayoutSubviews za każdym razem, gdy nastąpi zmiana na pasku stanu. Możesz to zmienić i dostosować subviews zgodnie z nowymi granicami.

- (void)viewWillLayoutSubviews { 
    // Your adjustments accd to 
    // viewController.bounds 

    [super viewWillLayoutSubviews]; 
} 
+0

Cóż, jeśli zmodyfikujesz granice, to 'viewWillLayoutSubviews' będzie ponownie wywoływany rekurencyjnie. – Rivera

+0

Dziwne, że viewController jest powiadamiany, ale nie jest zmieniany, wysokość się zmniejsza, każdy pomysł, dlaczego? –

+0

Świetnie! Możesz zaktualizować swoją ramkę contentFrame, którą możesz użyć jako stałej w twoim UIViewControllerze również tutaj, do self.view.bounds, więc przesunięcie rozprzestrzenia się w twojej hierarchii widoku. –

7

Widok może nie zostać automatycznie zmieniony przy zmianie rozmiaru paska stanu, jeśli nie ma ustawionego kontrolera głównego. Pierwotnie miałem to w swojej aplikacji, a moja aplikacja działała poprawnie pod każdym względem, z tym że nie zmieniła poprawnie podczas połączeń telefonicznych.

[self.window addSubview:rootController.view]; 

Zmieniłem powyższą linię na tę i teraz moja aplikacja zmienia rozmiar automatycznie podczas połączeń.

[self.window setRootViewController:rootController]; 

Odkryłem tę poprawkę po zobaczeniu tego w dzienniku i zbadaniu przyczyny.

Application windows are expected to have a root view controller at the end of application launch 
+0

Dziękuję bardzo! To zdecydowanie rozwiązało mój problem. – GeRyCh

+0

OMG to! To rozwiązało mój problem, po spędzeniu kilku godzin na podkręcaniu właściwości fullScreen prawie wszystkiego! – ArkReversed

7

to działa na mnie idealnie, kiedy moja aplikacja działa w tle i naciśnij polecenie + T. W moim scenariuszu kontroler główny jest mój kontroler tab bar i jestem przystosowujące moje kontroler nav wewnątrz każdej karcie.

- (void)application:(UIApplication *)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame{ 
[UIView animateWithDuration:0.35 animations:^{ 
    CGRect windowFrame = ((UINavigationController *)((UITabBarController *)self.window.rootViewController).viewControllers[0]).view.frame; 
    if (newStatusBarFrame.size.height > 20) { 
     windowFrame.origin.y = newStatusBarFrame.size.height - 20 ;// old status bar frame is 20 
    } 
    else{ 
     windowFrame.origin.y = 0.0; 
    } 
    ((UINavigationController *)((UITabBarController *)self.window.rootViewController).viewControllers[0]).view.frame = windowFrame; 
}]; 

}

+0

To nie powinno być konieczne; Myślę, że w szablonach Xcode jest błąd. Naprawiłem to, usuwając + odtwarzając kontroler widoku. Nowa odpowiedź odpowiada oczekiwaniom. –

+0

Naprawiłem to, w moim przypadku pchnąłem kontroler paska kart wewnątrz kontrolera nawigacyjnego, więc to było przyczyną problemów. Teraz działa bezproblemowo. Teraz kontroler paska kart jest moim głównym kontrolerem i zmieniam widok kontrolera nawigacyjnego wewnątrz kontrolera paska kart. – user1544494

+0

Dzięki za moją pracę dla mnie. Dzięki :) – ilesh

0

Żadne z rozwiązań zamieszczonych wcześniej pracował dla mnie. Udało mi się to, że nie miałem właściwie skonfigurowanych ograniczeń dla moich poglądów. W mojej sytuacji miałem dwa różne widoki kontenera w moim widoku.

View of scene in storyboard.

dno (na liście) widok pojemnika był UITableView, który nie został prawidłowo przewijania do spodzie stołu. Powodem było to, że przesunięcie paska stanu w trakcie wywołania zmieniło pochodzenie (lewy górny róg) UITableView, ale rozmiar pozostałby taki sam. Oznaczało to, że spód stołu był poza ekranem!

Rozwiązaniem było prawidłowe ustawienie ograniczenia wysokości Autoresizing. Na poniższym zrzucie ekranu znajdują się pionowe strzałki pośrodku pola Autoresizing.

enter image description here

+0

Mój pierwotny problem, kiedy wracaliśmy, był taki, że te strzały były po prostu niedostępne. Nigdy nie odkryłem dlaczego, ale odtworzenie widoku w kontrolerze widoku naprawiło to. –

+0

@StevenFisher dobrze wiedzieć! Dzięki! – mikeho

2

Powiadomienie na pasku stanu zmieniających ramy jest

UIApplicationWillChangeStatusBarFrameNotification

zarejestrować się jako obserwator:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarFrameWillChange:)name:UIApplicationWillChangeStatusBarFrameNotification object:nil];

Następnie reagowania na zmiany w procedurze obsługi:

- (void)statusBarFrameWillChange:(NSNotification*)notification { // respond to changes }

Nawet po prawidłowym skonfigurowaniu autolayout może być konieczna reakcja na zmiany. Na przykład widok tabeli, który oblicza wysokość komórki w oparciu o dane miejsce na ekranie, może wymagać reloadData po zmianie paska stanu.

Documentation

1

Trzeba będzie ręcznie zaktualizować widoki jeśli ustawienie Państwa zdanie klatek filmowych

-(void) viewDidAppear:(BOOL)animated 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(statusBarFrameWillChange:)name:UIApplicationWillChangeStatusBarFrameNotification object:nil]; 

} 

- (void)statusBarFrameWillChange:(NSNotification*)notification 
{ 
// respond to changes 
NSLog(@"STATUS BAR UPDATED"); 
NSDictionary *statusBarDetail = [notification userInfo]; 
NSValue *animationCurve = statusBarDetail[UIApplicationStatusBarFrameUserInfoKey]; 
CGRect statusBarFrameBeginRect = [animationCurve CGRectValue]; 
int statusBarHeight = (UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication]statusBarOrientation])) ? statusBarFrameBeginRect.size.height : statusBarFrameBeginRect.size.width; 

NSLog(@"status bar height %d", statusBarHeight); 
} 

-(void) viewDidDisappear:(BOOL)animated 
{ 
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationBackgroundRefreshStatusDidChangeNotification object:nil]; 
} 

To daje nową wysokość paska stanu i za pomocą tego można zaktualizować ramek odpowiednio.