Zrobiłem aplikację testową, aby zapoznać się z tworzeniem niestandardowego kontrolera widoku kontenera. Jeśli obrócę urządzenie, gdy aplikacja zostanie uruchomiona po raz pierwszy lub po zmianie na inny kontroler widoku, nowy widok zostanie zmieniony tak, aby zajmował cały ekran, tak jak zamierzałem. Jeśli jednak obrócę po uruchomieniu aplikacji, a następnie przejdę do nowego kontrolera widoku, widok zachowa swój rozmiar portretu, zamiast być coraz krótszy (w rzeczywistości jest nieco inny - wynosi od 320,460 do 300,480). Główny kontroler widoku jest przydzielany jako init'd w delegacie aplikacji (bez XIB) i ustawiony jako kontroler widoku głównego okna. Oto kod mam w MasterViewController (kontroler zwyczaj pojemnik):Widoki nie zmieniają rozmiaru po obrocie w niestandardowym kontrolerze kontenerów
- (void)viewDidLoad {
[super viewDidLoad];
WelcomeController *welcome = [[WelcomeController alloc] initWithNibName:@"ViewController" bundle:nil];
self.currentController = welcome;
[self addChildViewController:welcome];
[self.view addSubview:welcome.view];
UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeLeft:)];
swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft;
[self.view addGestureRecognizer:swipeLeft];
}
- (void)swipeLeft:(UISwipeGestureRecognizer *)gesture {
if (gesture.state == UIGestureRecognizerStateRecognized) {
UIActionSheet *sheet =[[UIActionSheet alloc] initWithTitle:@"Select A Destination" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"welcome",@"Play",@"Scores", nil];
[sheet showInView:self.view];
}
}
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
switch (buttonIndex) {
case 0:{
if ([self.currentController class] != [WelcomeController class]) {
WelcomeController *welcome = [[WelcomeController alloc] initWithNibName:@"ViewController" bundle:nil];
[self addChildViewController:welcome];
[self moveToNewController:welcome];
}
break;
}
case 1:{
if ([self.currentController class] != [PlayViewController class]) {
PlayViewController *player = [[PlayViewController alloc] initWithNibName:@"PlayViewController" bundle:nil];
[self addChildViewController:player];
[self moveToNewController:player];
}
break;
}
case 2:{
if ([self.currentController class] != [HighScores class]) {
HighScores *scorer = [[HighScores alloc] initWithNibName:@"HighScores" bundle:nil];
[self addChildViewController:scorer];
[self moveToNewController:scorer];
}
break;
}
case 3:
NSLog(@"Cancelled");
break;
default:
break;
}
}
-(void)moveToNewController:(id) newController {
[self.currentController willMoveToParentViewController:nil];
[self transitionFromViewController:self.currentController toViewController:newController duration:.6 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{}
completion:^(BOOL finished) {
[self.currentController removeFromParentViewController];
[newController didMoveToParentViewController:self];
self.currentController = newController;
}];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return YES;//(interfaceOrientation == (UIInterfaceOrientationPortrait | UIInterfaceOrientationLandscapeLeft));
}
Jakieś pomysły dlaczego tak się dzieje (nie wiem, czy to oznacza, że pogląd Widok główny regulatora nie jest zmiana rozmiaru, ale kiedy dostaję to zachowanie bez zmiany rozmiaru, rozpoznawanie gestów reaguje tylko w wąskim widoku, a nie na całym ekranie)?
Okazało się, że jeśli użyję pliku xib i przydzieli initWithNibName: bundle: zamiast samego init, działa poprawnie. Wydaje się, że ma to coś wspólnego z poglądem, który dostajesz po prostu, gdy robisz init. Kiedy jednak loguję widok, wygląda on tak samo niezależnie od tego, czy w zwykłym pliku init, czy w pliku Xib - oba mają tę samą ramkę i to samo automatyczne przypisywanie = W + H – rdelmar
definiują programowo automatyczne maskowanie 'UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight' – yasirmturk