У SKStoreProductViewController и GKHostedAuthenticateViewController нет ландшафтных режимов iPhone

Я реализую интерфейс покупки приложения StoreKit in-app, и хотя кажется, что SKStoreProductViewController обрабатывает ландшафт на iPad, он, похоже, не делает этого для моего приложения на iPhone (он универсален).

Интерфейс SKStoreProductViewController настолько ограничен, я никак не могу манипулировать VC. Кто-нибудь еще сталкивается с этим? Любые рабочие обходы?

Когда я запускаю код, который работает на iPad, SKStoreProductViewController поступает с левой стороны, примерно на дюйм, и висит там до увольнения. Кажется функциональным, но это испортило VC, который выскочил после увольнения.

Здесь код:

// Set up the store vc (creating it if not already done)
if (self.storeVC == nil) self.storeVC = [[SKStoreProductViewController alloc] init];
self.storeVC.delegate = self;
NSDictionary *params = [NSDictionary dictionaryWithObject:appID forKey:SKStoreProductParameterITunesItemIdentifier]; 

// Set up a HUD in case connecting to the store takes a while
[MBProgressHUD showHUDAddedTo:self.view animated:YES]; 

[self.storeVC loadProductWithParameters:params
                        completionBlock:^(BOOL result, NSError *error) {
       [MBProgressHUD hideHUDForView:self.view animated:YES];
       if (result) {
           [self presentViewController:self.storeVC animated:NO completion:^{
           }];
       }
  }];

Еще лучше, у нас такая же проблема на GKHostedAuthenticateViewController, которая является обработчиком view, возвращаемым из метода:

GKLocalPlayer.authenticateHandler = ^(UIViewController *loginVC, NSError *error) {};

Повторить: оба они находятся в портретном режиме на iPhone (но не в iPads), и они заставляют пользовательский интерфейс перейти в портретный режим. По возвращении пользовательский интерфейс приложения испорчен.

Ответ 1

У меня возникла аналогичная проблема. Мое универсальное приложение в ландшафте, но в то время как SKStoreProductViewController работает достаточно хорошо в ландшафте на iPad, он представляет собой визуальные глюки на iPhone.

Мое решение состояло в том, чтобы заставить iPhone представить SKStoreProductViewController в портрете. Немного грустно, что он не имеет такой же ориентации, как и остальные приложения, но лучше, чем отключить половину экрана.

Я выполнил это, используя пользовательский подкласс ниже:

@interface SKPortraitStoreProductViewController : SKStoreProductViewController
@end

@implementation SKPortraitStoreProductViewController
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
        return UIInterfaceOrientationPortrait;
    else
        return [super preferredInterfaceOrientationForPresentation];
}
@end

Ответ 2

Попробуйте изменить свойство modalPresentationStyle на SKStoreProductViewController перед его представлением.

Мне повезло, установив его на UIModalPresentationPageSheet, который, по-видимому, отлично подходит для iPad iPad.