2013-05-08 12 views
13

Chciałbym zapytać o automatyczny układ i pasek stanu połączenia. Oto prosty scenariusz, który pokazuje mój problem:Automatyczny układ i pasek stanu w trakcie połączenia

  1. Utwórz projekt z „Use storyboardy” Enabled
  2. Add „View Controller” i umożliwić jej „Czy Widok początkowy Controller”
  3. Ustaw kolor tła widoku kontrolera do czerwony
  4. Dodaj "table view" do widzenia regulatora

widok tabela powinna mieć 4 ograniczeń układ (wiodący, top, na końcu, na dole) Superview ze stałą wartość 0.

Teraz gdy uruchamiam aplikację w symulatorze i naciśnij + T widzę czerwone tło, natomiast pasek statusu na wezwanie ożywia się. Czy to możliwe, aby pozbyć się tej usterki?

+0

Pasek stanu połączenia będzie ożywiać to zachowanie, można sprawdzić nawet po wyjściu z aplikacji. To "przełącz przycisk paska stanu połączenia". Nie wiem o czerwonym tle. – Amit

+0

Wygląda podobnie do pytania: http://stackoverflow.com/questions/25882609/how-to-do-layout-to-handle-in-call-double-height-status-bar-for-custom-present/42507117 # 42507117 – hhamm

Odpowiedz

7

(Korzystanie odpowiedź zamiast komentarza z powodu braku dobrego imienia, przepraszam.)

Pobiegłem do tej kwestii, jak również i starał się, na przykład rozwiązanie wskazane powyżej: to nie działa dla mnie.

Więc I created a repository z kodem przykładowym, aby odsłonić problem z oryginalnym plakatem. Są to przykładowe aplikacje dla tych scenariuszy:

  1. View Controller zwyczaj kontroler widoku głównego okna, w
  2. View Controller klienta jest dzieckiem UINavigationController który jest oknem na widok główny kontroler,
  3. z Sterownik widoku niestandardowego jest potomkiem kontrolera UITabBarController, który jest kontrolerem widoku głównego okna i kontroler widoku niestandardowego jest potomkiem elementu UINavigationController, który jest elementem potomnym kontrolera UITabBarController, który jest kontrolerem widoku głównego okna.

Okazało się, że solution from CEarwood faktycznie działa ... kiedy niestandardowy kontroler widoku jest dzieckiem elementu UINavigationController (przypadki 2 i 4). Jednak nie działa w przypadkach 1 i 3.

Mam nadzieję, że ta informacja jest przydatna.

+0

didnot dla mnie nie działa –

2

Jest to efekt zmiany rozmiaru ekranu.

Gdy pojawi się pasek stanu połączenia, widok zmienia się do rozmiaru, jaki powinien mieć, gdy pasek stanu w trakcie połączenia jest aktywny, a następnie przesuwa się w dół wraz ze zmianą paska stanu.

Przez krótką chwilę widok pod widokiem tabeli jest widoczny. Możesz dodać widok pod widokiem tabeli rozciągający się w dół poza ekranem, aby ukryć kolor tła.

Innym podejściem jest ze swojej AppDelegate, wdrożenia:

-application:willChangeStatusBarFrame: 

i rozmiaru widoku tabeli na pokrycie bit, który zostanie odsłonięty. Następnie, gdy zostanie wywołane - application:didChangeStatusBarFrame:, zmień rozmiar z powrotem na pierwotny rozmiar.

7

Aby uzyskać odpowiedź z automatycznym układem, można uzyskać odwołanie do ograniczenia dolnego i dopasować jego stałą, gdy otrzyma się komunikat UIApplicationWillChangeStatusBarFrameNotification i wrócić do 0 po otrzymaniu powiadomienia DidChange. Oto VC testu użyłem:

@interface CEViewController() 

@property (nonatomic, strong) IBOutlet NSLayoutConstraint *bottomConstraint; 

@end 

@implementation CEViewController 

- (void)viewDidLoad { 
    [super viewDidLoad];   

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

- (void)statusBarFrameWillChange:(NSNotification *)note { 
    NSValue *newFrameValue = [note userInfo][UIApplicationStatusBarFrameUserInfoKey]; 

    self.bottomConstraint.constant = newFrameValue.CGRectValue.size.height; 
    [self.view setNeedsLayout]; 
} 

- (void)statusBarFrameDidChange:(NSNotification *)note { 
    self.bottomConstraint.constant = 0; 
    [self.view setNeedsLayout]; 
} 

@end 
Powiązane problemy