2

使用我的应用程序时,用户可以单击并观看列表中显示的视频。一旦他们点击该视频,他们就可以将方向更改为纵向或横向。列表页面仅为纵向。

我面临的错误是当用户观看横向视频并以横向退出页面时,我的列表页面变得一团糟。

每次用户在视频上按下完成并返回列表时,我都需要一种方法将方向转回纵向。

在列表页面上我确实有

- (BOOL)shouldAutorotate{
  return YES;
}

我什至尝试shouldAutorotate在 viewDidAppear 中调用方法,但这不起作用。我知道shouldAutorotate在页面加载后不会调用它,所以有没有办法检查方向然后翻转它或者无论如何都让它成为纵向?

我仍然需要风景,所以我不会从我的 plist 文件中删除它。

任何帮助都会很棒。谢谢

编辑

这是我如何称呼我的视频播放器

    MPMoviePlayerViewController *player=[[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:[[main_data objectAtIndex:indexPath.row] objectForKey:@"url"]]];

    UIView * playerView = [player view];
    [playerView setFrame: CGRectMake(0, 0, 480, 320)];

    CGAffineTransform landscapeTransform;
    landscapeTransform = CGAffineTransformMakeRotation(90*M_PI/180.0f);
    landscapeTransform = CGAffineTransformTranslate(landscapeTransform, 80, 80);

    [playerView setTransform: landscapeTransform];

    [self presentMoviePlayerViewControllerAnimated:player];

    return;    
4

6 回答 6

2

在 iOS 6 上,自动旋转行为的机制发生了变化,因此如果您在 iOS 6 设备上进行测试,则需要做一些额外的工作。在您的视图控制器中,添加以下方法:

-(NSInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}
于 2013-03-25T16:03:28.563 回答
1

您有几种方法可供您使用。也许最简单和最可控的就是子类化MPMoviePlayerViewController.

首先让您的应用支持所有界面方向(在 中app-info.plist)。然后使用适用于 iOS 6 和更早版本操作系统的方法限制您的列表视图(假设它是):MyListViewController.m

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
 return UIInterfaceOrientationMaskPortrait;
}

- (NSUInteger) supportedInterfaceOrientations {
 return(UIInterfaceOrientationMaskPortrait);
}

- (BOOL) shouldAutorotate {
 return FALSE;   
}

现在创建一个派生自 的新的 Objective C 类MPMoviePlayerViewController,称为MyMoviePlayerViewController. 这是MyMoviePlayerViewController.h

#import <MediaPlayer/MediaPlayer.h>

@interface MyMoviePlayerViewController : MPMoviePlayerViewController

@end

这是MyMoviePlayerViewController.m

#import "MyMoviePlayerViewController.h"

@interface MyMoviePlayerViewController ()
@end

@implementation MyMoviePlayerViewController

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
 return YES;
}

- (NSUInteger) supportedInterfaceOrientations {
 return(UIInterfaceOrientationMaskAll);
}

- (BOOL) shouldAutorotate {
 return TRUE;    
}

-(id)initWithContentURL:(NSURL *)contentURL {
 UIGraphicsBeginImageContext(CGSizeMake(1,1));
 self = [super initWithContentURL:contentURL];
 UIGraphicsEndImageContext();
 if (self) {
    self.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
        [[NSNotificationCenter defaultCenter] removeObserver:self
            name:MPMoviePlayerPlaybackDidFinishNotification
            object:[self moviePlayer]];
        [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(movieFinishedCallback:)
            name:MPMoviePlayerPlaybackDidFinishNotification
            object:[self moviePlayer]];
 }
 return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
[[self moviePlayer] setFullscreen:YES animated:NO];
[self moviePlayer].controlStyle = MPMovieControlStyleDefault;
}

- (void)movieFinishedCallback:(NSNotification*)notification {
    MPMoviePlayerController *moviePlayer = [notification object];
    [[NSNotificationCenter defaultCenter] removeObserver:self
        name:MPMoviePlayerPlaybackDidFinishNotification
        object:moviePlayer];
    self.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [self dismissViewControllerAnimated:YES completion:nil];
}
@end

然后,添加到MyListViewController.h

#import "MyMoviePlayerViewController.h"

并且,在 中MyListViewController.m,使用:

MyMoviePlayerViewController *player =[[MyMoviePlayerViewController alloc]
    initWithContentURL:URLWithString:[[main_data objectAtIndex:indexPath.row]
    objectForKey:@"url"]]];
[self presentViewController:player animated:YES completion:nil];

显然,您可以调整设置(例如动画样式、要显示的控件...)以满足您的特定需求。

于 2013-03-29T12:13:31.453 回答
0

[UIViewController attemptRotationToDeviceOrientation]当你的视频控制器被隐藏时调用呢?

于 2013-03-25T16:27:40.730 回答
0

在您的列表视图控制器中实现它

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
  return UIInterfaceOrientationPortrait ;
}

-anoop

于 2013-03-28T07:55:27.390 回答
0

试试这个,

在您的 viewdidLoad 方法中写下这一行以支持应用程序中的方向,

//rotation
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged) name:@"UIDeviceOrientationDidChangeNotification" object:nil];



#pragma mark -Rotation
//method for rotate your playerview, as user changes orientation
-(void)orientationChanged 
{
    NSLog(@"Orientation Changed..!!");
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.35];
    if ([[UIDevice currentDevice] orientation] == UIInterfaceOrientationPortrait)  {
        playerView.transform = CGAffineTransformMakeRotation(0);
    }
    else if ([[UIDevice currentDevice] orientation] == UIInterfaceOrientationPortraitUpsideDown) {
        playerView.transform = CGAffineTransformMakeRotation(M_PI);
    }
    else if ([[UIDevice currentDevice] orientation] == UIInterfaceOrientationLandscapeLeft)  {
        playerView.transform = CGAffineTransformMakeRotation(M_PI+(M_PI/2));
    }
   else if ([[UIDevice currentDevice] orientation] == UIInterfaceOrientationLandscapeRight)        {
        playerView.transform = CGAffineTransformMakeRotation(M_PI/2);
    }
    [UIView commitAnimations];
}

#ifdef IOS_OLDER_THAN_6
- (BOOL)shouldAutorotateToInterfaceOrientation:   (UIInterfaceOrientation)toInterfaceOrientation
{
    return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
}
#endif

// For Newer than IOS 6.
#ifdef IOS_NEWER_OR_EQUAL_TO_6
-(BOOL)shouldAutorotate
{
    return NO;
}
- (NSUInteger)supportedInterfaceOrientations
{
    return (UIInterfaceOrientationMaskPortrait);
}
#endif

希望这会有所帮助。,谢谢你..快乐编码

于 2013-03-29T04:06:10.530 回答
0

我认为你需要在下面的代码中编写代码- (void)movieFinishedCallback:(NSNotification*)notification

- (void)movieFinishedCallback:(NSNotification*)notification 
{
    [self.view setFrame: CGRectMake(0, 0, 320, 480)];
    CGAffineTransform landscapeTransform;
    landscapeTransform = CGAffineTransformMakeRotation(270*M_PI/180.0f);
    landscapeTransform = CGAffineTransformTranslate(landscapeTransform, 80, 80);
    [self.view setTransform: landscapeTransform];
}
于 2013-03-30T11:48:08.133 回答