4

一般来说,我对 iOS 平台和目标 C 的编码相当陌生。我正在使用故事板编写一个简单的 iPhone 应用程序,该应用程序具有通过嵌入在 UIScrollView 中的 UIImageView 显示的高 png 文件,并且旁边有一个按钮可以播放电影。

我的问题是,当电影结束/退出并返回到原始屏幕时,UIScrollView 内的滚动不起作用。我已经确定了“原因”。当我将 MPMoviePlayerViewController object.view 添加到 self.view 子视图时会发生这种情况。但我不确定如何纠正这个问题。这是我的蒸馏代码:

.h 文件

@interface StuffViewController : UIViewController 

@property (strong,nonatomic) IBOutlet UIImageView *imageView;
@property (strong,nonatomic) IBOutlet UIScrollView *scrollView;

-(IBAction) playMovie;
-(void) moviePlayBackDidFinish:(NSNotification*)notification;

@end

.m 文件

-(void) viewDidLoad {
    self.imageView.image = [UIImage imageNamed:@"image.png"];
}

-(void) viewDidAppear:(BOOL)animated {
    self.scrollView.contentSize = self.imageView.image.size;
}

-(void) playMovie {
    NSURL *movieURL = [NSURL fileURLWithPath:[[NSBundle mainBundle]
                                         pathForResource:@"movieTitle" ofType:@"mp4"]];
    MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] 
                                                initWithContentURL:movieURL];
       [[NSNotificationCenter defaultCenter] addObserver:self
                                        selector:@selector(moviePlayBackDidFinish:)
                                            name:MPMoviePlayerPlaybackDidFinishNotification
                                          object:moviePlayer];
    [moviePlayer setMovieSourceType:MPMovieSourceTypeFile];
    [[self view] addSubview:moviePlayer.view];   //SCROLLING BREAKS HERE
    [moviePlayer setFullscreen:YES];
    [moviePlayer play];
}

-(void)moviePlayBackDidFinish: (NSNotification*)notification {
    MPMoviePlayerController *movieDone = [notification object];
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [movieDone.view removeFromSuperview];
    [movieDone setFullscreen:NO];
}

我通过注释掉部分确定了罪魁祸首,就像我说的那样,滚动“锁定”在“[[self view] addSubview:moviePlayer.view];” 线并且直到我导航到不同的视图然后返回才恢复。

对此的任何和所有帮助将不胜感激。

编辑:我发现了一个有趣的皱纹,可能有助于发现潜在的问题。

我一直在使用MPMoviePlayerController这个。然而,切换到MPMoviePlayerViewController一些有趣的事情已经发生了。

这是更改后的 -(void)playMovie

-(void) playMovie {
   self.scrollView.contentOffset = CGPointZero;
   NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle]
                                    pathForResource:totalTitle ofType:@"mp4"]];
   MPMoviePlayerViewController *playerController =  [[MPMoviePlayerViewController alloc] initWithContentURL:url];
   [self presentMoviePlayerViewControllerAnimated:playerController];
   playerController.moviePlayer.movieSourceType = MPMovieSourceTypeFile;
   [playerController.moviePlayer play];
   playerController = nil;
}

有趣的是 UIScrollView 仍然可以工作,但是,如果它已经向下滚动,它将不再能够从电影开始时的位置向上滚动。我通过self.scrollView.contentOffset = CGPointZero在开头添加来解决此问题,playMovie以告诉 scrollView 移动到顶部(因此它上面没有任何东西必须滚动回)。我假设在代码中添加某种 if 语句viewDidAppear可以防止 scrollView.contentSize 重新执行可能会解决无法向上滚动的问题,但是我喜欢它从最佳。

不过最后一期。MPMoviePlayerViewController *playerController = [[MPMoviePlayerViewController alloc] initWithContentURL:url];像这样使用 MPMoviePlayerViewController 会导致在执行 line时在我的调试器中弹出许多有趣的错误。它们如下:

Oct 25 10:25:51 Compy.local AppName[14590] <Error>: CGContextSaveGState: invalid context 0x0 
Oct 25 10:25:51 Compy.local AppName[14590] <Error>: CGContextClipToRect: invalid context 0x0
Oct 25 10:25:51 Compy.local AppName[14590] <Error>: CGContextTranslateCTM: invalid context 0x0
Oct 25 10:25:51 Compy.local AppName[14590] <Error>: CGContextDrawShading: invalid context 0x0
Oct 25 10:25:51 Compy.local AppName[14590] <Error>: CGContextRestoreGState: invalid context 0x0

它似乎没有破坏任何东西。然而,当涉及到错误的错误陈述时,我往往是一个完美主义者。我已经对这些错误进行了一些研究,但是我还没有发现任何合适的东西可以在这种情况下发挥强大的作用。

感谢您迄今为止的所有帮助!再一次,我也将不胜感激。

4

3 回答 3

2

您确定所有内容都从超级视图中删除了吗?另外,您可以尝试更换

 MPMoviePlayerController *movieDone = [notification object];

 MPMoviePlayerController *movieDone = (MPMoviewPlayerController *)[notification object];

并添加

movieDone = nil;

为确保您的 MPMoviePlayerController 已从 superView 中完全删除,请在视频播放完毕后尝试按下视图上的按钮(在添加 MPMoviePlayerController 之前创建)并查看它是否触发。导航控制器必须以模态方式呈现您的 MPMoviewPlayerController 或进行推送。如果它以模态方式呈现,请尝试在播放完成后将其关闭。

于 2012-10-25T08:54:56.423 回答
1

问题的原因是在情节提要中使用了“自动布局”。我不是 100% 确定为什么它会在播放电影之后而不是之前导致它出现问题。但是我通过以下方式修复了它:

A:删除自动布局

或者

B:玩弄约束函数,直到它最终工作为止。(将 UIImageView 的高度更改为 0 并将其更改为Equals: Default尽可能低的优先级。)

于 2012-11-10T09:28:27.827 回答
0

尝试在方法中设置SetUserInteractionEnabledofself和/或self.scrollviewto 。此外,检查滚动视图属性的大小,以检查大小是否大于您的实际屏幕大小,以查看是否导致滚动视图的功能中断。YESmoviePlayBackDidFinishContentSize

于 2012-10-25T07:32:04.780 回答