2016-11-15 4 views
0

Я создаю приложение для воспроизведения 360 видеороликов - все отлично работает!iOS Objective-C Xcode - Как начать играть только в ландшафте

Однако, хотелось бы, чтобы видео начало играть, только если мобильный ориентирован в ландшафте! IF на портрете должен отображать сообщение «Пожалуйста, поместите свой мобильный в альбом», и если да, начните воспроизведение видео. ..

У кого-нибудь есть идеи, как этого достичь?

Было бы замечательно :)

Спасибо!


EDIT:

мой Viewcontroller.m

// 
// ViewController.m 
// video360test 
// 
// Created by linyize on 16/6/20. 
// Copyright © 2016年 islate. All rights reserved. 
// 

#import "ViewController.h" 

#import "Video360ViewController.h" 

#import "CardboardViewController.h" 
#import "CardboardSDK.h" 

@implementation ViewController 

- (BOOL)prefersStatusBarHidden { 
return YES; 
} 

- (BOOL)shouldAutorotate 
{ 
return NO; 
} 

- (NSUInteger)supportedInterfaceOrientations 
{ 
return UIInterfaceOrientationMaskPortrait; 
} 

- (IBAction)playURL:(id)sender 
{ 
NSURL *url = [NSURL URLWithString:@"http://7b1gcw.com1.z0.glb.clouddn.com/demo1.mp4"]; 
Video360ViewController *videoController = [[Video360ViewController alloc] initWithNibName:@"HTY360PlayerVC" bundle:nil url:url]; 

if (![[self presentedViewController] isBeingDismissed]) { 
    [self presentViewController:videoController animated:YES completion:nil ]; 

} 
} 

- (IBAction)playFileffpvr:(id)sender 
{ 
NSString *path = [[NSBundle mainBundle] pathForResource:@"demo1" ofType:@"mp4"]; 
NSURL *url = [NSURL fileURLWithPath:path]; 

Video360ViewController *videoController = [[Video360ViewController alloc] initWithNibName:@"HTY360PlayerVC" bundle:nil url:url]; 


[videoController VRMode:true]; 

if (![[self presentedViewController] isBeingDismissed]) { 
    [self presentViewController:videoController animated:YES completion:nil]; 
} 
} 

- (IBAction)playFileff360:(id)sender 
{ 
NSString *path = [[NSBundle mainBundle] pathForResource:@"demo1" ofType:@"mp4"]; 
NSURL *url = [NSURL fileURLWithPath:path]; 
Video360ViewController *videoController = [[Video360ViewController alloc] initWithNibName:@"HTY360PlayerVC" bundle:nil url:url]; 

if (![[self presentedViewController] isBeingDismissed]) { 
    [self presentViewController:videoController animated:YES completion:nil]; 
} 
} 

- (IBAction)playFile2:(id)sender 
{ 
NSString *path = [[NSBundle mainBundle] pathForResource:@"boa" ofType:@"mp4"]; 
NSURL *url = [NSURL fileURLWithPath:path]; 
Video360ViewController *videoController = [[Video360ViewController alloc] initWithNibName:@"HTY360PlayerVC" bundle:nil url:url]; 

if (![[self presentedViewController] isBeingDismissed]) { 
    [self presentViewController:videoController animated:YES completion:nil]; 
} 
} 

- (IBAction)playFileffp:(id)sender 
{ 
NSString *path = [[NSBundle mainBundle] pathForResource:@"boa" ofType:@"mp4"]; 
NSURL *url = [NSURL fileURLWithPath:path]; 
Video360ViewController *videoController = [[Video360ViewController alloc] initWithNibName:@"HTY360PlayerVC" bundle:nil url:url]; 

if (![[self presentedViewController] isBeingDismissed]) { 
    [self presentViewController:videoController animated:YES completion:nil]; 
} 
} 

@end 

@implementation LandscapeNavController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
if (self) { 
    // Custom initialization 
} 
return self; 
} 

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
// Do any additional setup after loading the view. 
self.navigationBarHidden=YES; 
} 

-(BOOL)shouldAutorotate{ 

return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations{ 

return UIInterfaceOrientationMaskLandscape; 
} 


- (void)didReceiveMemoryWarning 
{ 
[super didReceiveMemoryWarning]; 
// Dispose of any resources that can be recreated. 
} 

EDIT 2:

кнопку отображения правильно предупреждение теперь:

- (IBAction)playFileffpvr:(id)sender 

{ 
NSString *path = [[NSBundle mainBundle] pathForResource:@"demo1" ofType:@"mp4"]; 
NSURL *url = [NSURL fileURLWithPath:path]; 

UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; 

if (orientation == UIDeviceOrientationPortrait) 
    [self doSomething]; 
else 
    [self doSomethingElse]; 



Video360ViewController *videoController = [[Video360ViewController alloc] initWithNibName:@"HTY360PlayerVC" bundle:nil url:url]; 

[videoController VRMode:true]; 

if (![[self presentedViewController] isBeingDismissed]) { 
    [self presentViewController:videoController animated:YES completion:nil]; 
} 
} 

и предупреждение является дисплей:

-(void)doSomething 
{ 

//Show Alert 

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Simple" message:@"Turn your device to Landscape." preferredStyle:UIAlertControllerStyleAlert]; 
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) { 
    NSLog(@"Cancel"); 
}]; 
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { 
    NSLog(@"OK"); 
}]; 

[alertController addAction:cancelAction]; 
[alertController addAction:okAction]; 
[self presentViewController:alertController animated: YES completion: nil]; 
} 

-(void)doSomethingElse 
{ 
//Function Body 
//play the file 
} 
+0

Вы используете MPMoviePlayerController для воспроизведения видео? –

+0

Нет, я использую https://github.com/islate/SlateVideo360 Но если у вас что-то работает с MPMovie, возможно, я смогу заставить его работать с этим? – tibewww

+0

Если вы представляете контроллер видеоизображения, вы можете заставить его быть только ландшафтом. – Lefteris

ответ

0

Да, все, что вам нужно сделать, это создать UINavigationController подкласс говорят LandscapeNavController и поместить код ниже

LandscapeNavController.h

#import <UIKit/UIKit.h> 

@interface LandscapeNavController : UINavigationController 

@end 

LandscapeNavController.m

@implementation LandscapeNavController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
    self.navigationBarHidden=YES; 
} 

-(BOOL)shouldAutorotate{ 

    return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations{ 

    return UIInterfaceOrientationMaskLandscape; 
} 


- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

Теперь представляем видео контроллер как модальный, как указано ниже

VideoController *controller=<INITIALIZE> 
LandscapeNavController *nav=[[LandscapeNavController alloc] initWithRootViewController:controller]; 
[self presentViewController:nav animated:YES completion:nil]; 

и убедитесь, что параметры вращения должны быть

enter image description here

Кроме того, в AppDelegate.h определяют

@property (назначить) BOOL должен Поворот;

выше свойство должно быть установлено на YES, прежде чем представить видеоконтроллер и NO до увольнения в видеоконтроллер.

и добавьте следующий код в AppDelegate.m

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 
{ 

    if (shouldRotate) 
     return UIInterfaceOrientationMaskAll; 
    else 
     return UIInterfaceOrientationMaskPortrait; 
} 

Примечание - Приведенный выше код не тестировался прямо сейчас, если вы сталкиваетесь проблема пинг.

Cheers.

0

Объявите свойство для UIAlertController как:

@property (strong, nonatomic)UIAlertController *alertController; 

Вы можете использовать такой код:

- (void)viewWillAppear:(BOOL)animated { 

    [super viewWillAppear:animated]; 
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceOrientationDidChange) name:UIDeviceOrientationDidChangeNotification object:nil]; 
} 

-(void)deviceOrientationDidChange 
{ 
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; 
    if (orientation == UIDeviceOrientationPortrait) 
     [self doSomething]; 
     else 
      [self doSomethingElse]; 
    } 
-(void)doSomething 
{ 

//Show Alert 

self.alertController = [UIAlertController alertControllerWithTitle:@"Simple" message:@"Turn your device to Landscape." preferredStyle:UIAlertControllerStyleAlert]; 
    UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) { 
     NSLog(@"Cancel"); 
    }]; 
    UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { 
     NSLog(@"OK"); 
    }]; 

    [self.alertController addAction:cancelAction]; 
    [self.alertController addAction:okAction]; 
    [self presentViewController:alertController animated: YES completion: nil]; 
} 
-(void)doSomethingElse 
{ 
//Hide the AlertViewController 
[self.alertController removeFromSuperview]; 
//Code to handle the playing of the file 
} 
-(BOOL)shouldAutorotate{ 

    return YES; 
} 

Счастливого кодирование. Надеюсь, поможет.

+0

Hi Ibrahim, Я добавил, что в моем Viewcontroller.m без успеха он просто запустил видео для воспроизведения в портрете. , .. Я обновил свой оригинальный questoin с кодом в моем Viewcontroller.m, если это помогает? Большое спасибо за ваше время! – tibewww

+0

ok, сообщение появляется, когда я вхожу в контроллер просмотра yes :) Но так или иначе, что он появляется только один, я нажал на одну из кнопок :(? И заставьте его исчезнуть после того, как я нахожусь в ladnscape? Он должен сделайте следующий путь: Когда я прихожу к контроллеру своего вида, я нажимаю на одну кнопку. Эта кнопка начинает воспроизведение видео. При нажатии этой кнопки, если пользователь находится на портрете, он должен отображать это сообщение и делать запустите видео, только когда пользователь находится на пейзаже. Спасибо за все ваше время;) – tibewww

+0

Пожалуйста, уточните мой обновленный ответ –

Смежные вопросы