添加新子视图时,UIScrollView会中断

时间:2012-10-25 07:06:17

标签: xcode uiscrollview subview

我很擅长编写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时,一些有趣的事情已经发生。

这是改变的 - (无效)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移动到顶部(因此上面没有任何内容可以滚动回去)。我假设在viewDidAppear中的代码中添加某种if语句会使scrollView.contentSize不能重新执行,这可能会解决无法向后滚动的问题,但我喜欢'清洁'它从顶部开始。

最后一个问题。像这样使用MPMoviePlayerViewController会在执行MPMoviePlayerViewController *playerController = [[MPMoviePlayerViewController alloc] initWithContentURL:url];行时在我的调试器中弹出一些有趣的错误。它们如下:

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

它似乎没有破坏任何东西。然而,当谈到错误的错误陈述时,我倾向于成为完美主义者。我已经对这些错误进行了一些研究,但是我没有发现任何适合这种情况的方法。

感谢迄今为止的所有帮助!再一次,我将非常感谢这方面的任何和所有帮助。

3 个答案:

答案 0 :(得分:2)

你确定从superview中删除了所有内容吗?此外,您可以尝试替换

 MPMoviePlayerController *movieDone = [notification object];

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

并添加

movieDone = nil;

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

答案 1 :(得分:1)

问题的原因是在故事板中使用'Autolayout'。我不是百分之百确定为什么它会在播放电影之后而不是之前引起问题。但是我通过以下方法修复了它:

A:删除Autolayout

B:使用约束功能直到它最终工作。 (将UIImageView的高度更改为0并将Equals: Default更改为可能具有最低优先级。)

答案 2 :(得分:0)

尝试在SetUserInteractionEnabled方法中将self {/ 1}}和/或self.scrollview设置为YES。 另外,检查滚动视图的moviePlayBackDidFinish属性的大小,检查大小是否大于实际屏幕大小,以查看是否导致滚动视图的功能中断。