Проблема с * некоторыми * UIViews, нуждающимися в ширине и высоте назад в их кадре - PullRequest
1 голос
/ 09 ноября 2010

Я пытаюсь создать игру для iPhone, однако я сталкиваюсь с некоторыми (я надеюсь) простыми, но запутанными проблемами.

Я заставляю мое приложение находиться в режиме UIInterfaceOrientationLandscapeRight, это устанавливается в .plist, и каждый из моих UIViewControllers возвращает это как единственную жизнеспособную ориентацию для shouldAutorotateToInterfaceOrientation

Это работает ... иногда. Каждая из моих xibs была разработана для работы в ландшафтном режиме, и все ViewController настроены очень похоже. Вот моя проблема:

Я создаю экземпляры всех своих UIViewControllers программно, например:

splashScreen = [[SplashScreenController alloc] initWithNibName:@"SplashScreenView" bundle:[NSBundle mainBundle]];
splashScreen.view.frame = CGRectMake(0, 0, [[GameConsts defaultGameConsts] screenWidth], [[GameConsts defaultGameConsts] screenHeight]);
[[self view] addSubview: [splashScreen view]];

mainMenu = [[MainMenuController alloc] initWithNibName: @ "MainMenuView" bundle: [NSBundle mainBundle]]; mainMenu.view.frame = CGRectMake (0, 0, [[GameConsts defaultGameConsts] screenWidth], [[GameConsts defaultGameConsts] screenHeight]); [[self view] addSubview: [mainMenu view]];

Это работает нормально, но когда я активирую свои «игровые виды», то есть игровые меню и реальное игровое поле, мне нужно инвертировать параметры screenWidth и screenHeight, чтобы они правильно отображались. Я не понимаю, почему это так, и я пока не смог понять это. Вот как они создаются:

- (void) setupGameViews
{
 // Why do these need to be reversed to show up properly? (Height and Width!)
 gameView = [[GameController alloc] initWithNibName:@"GameView" bundle:[NSBundle mainBundle]];
 gameView.view.frame = CGRectMake(0, 0, [[GameConsts defaultGameConsts] screenHeight], [[GameConsts defaultGameConsts] screenWidth]);
 [[self view] addSubview: [gameView view]];

 gameMenu = [[GameMenuController alloc] initWithNibName:@"GameMenuView" bundle:[NSBundle mainBundle]];
 gameMenu.view.frame = CGRectMake(0, 0, [[GameConsts defaultGameConsts] screenHeight], [[GameConsts defaultGameConsts] screenWidth]);
 [[self view] addSubview: [gameMenu view]];
}

(Примечание. Этот метод вызывается при нажатии кнопки запуска игры. Это все внутри «родительского» UIViewController, который не имеет связанного с ним представления, но вместо этого содержит и настраивает все эти подпредставления. Может быть, есть проблема с их архитектурой? Я видел несколько похожих примеров, поэтому решил использовать ее.)

Для полноты, вот определения в синглтоне GameConsts во время его метода init:

- (id) init
{
 screenWidth = [[UIScreen mainScreen] applicationFrame].size.width;
 screenHeight = [[UIScreen mainScreen] applicationFrame].size.height;

 screenCenter = CGPointMake(screenSizeHeight / 2, screenSizeWidth / 2);

 return [super init];
}

screenWidth и screenHeight - это значения с плавающей точкой. screenCenter - это CGPoint. Если вы заметили, я изменил высоту / ширину в screenCenter CGPoint, потому что в противном случае, когда я пытаюсь нарисовать объект в центре экрана, он отображается в левом нижнем углу экрана.

Это сводит меня с ума и удерживает меня от гораздо более забавных частей этого опыта. Если кто-то может оказать помощь, это было бы замечательно. Если потребуется дополнительная информация, дайте мне знать.

1 Ответ

2 голосов
/ 09 ноября 2010

Я думаю, что applicationFrame всегда возвращает рамку для портретной ориентации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...