问题
在屏幕上绘制自定义电影播放器控制器(iOS 4)时,我使用AVPlayerLayer
进行显示。我希望在播放器上添加一些叠加(广告横幅,播放器控件等)。目前,这与以下层次结构完全一致:
UIView(self.view)\ | UIView(controlsView)\ * | UIView [some movie player controls] | UIView [some more movie player controls] *
AVPlayerLayer
是self.view
的子图层。在播放器加载时,我首先将图层添加到self.view
并在bringSubviewToFront:
上调用controlsView
,然后检测其上的点击并以编程方式显示/淡出计时器/其他内容。这里没问题。
既然我支持动态获取和显示广告内容,我想设置以下层次结构:
UIView(self.view)\ | UIImageView (ad banner) | UIImageView (another ad banner) | ... | UIView(controlsView)\ * | UIView [some movie player controls] | UIView [some more movie player controls] *
在播放器加载时,我接下来会在AVPlayer
个实例上附加一些addBoundaryTimeObserverForTimes:queue:usingBlock:
来电,以便在适当的时间将广告横幅淡入淡出。在我执行此操作时,我将UIImageView
添加到self.view
作为子视图,没有明确的排序(因此它们应该在其他所有内容之上绘制),并在它们上面setHidden:YES
。
我已NSLog
'd并正确执行了这些淡入淡出模块,分别在广告横幅上设置view.alpha = 1.0f
和view.alpha = 0.0f
以显示和隐藏,但一切都没有出现,即使明确将视图显示的UIImage
设置为已知的工作本地图像,并将框架设置为(0, 0, 320, 480)
,另外设置autoresizingMask
UIViewAutoresizingFlexibleTopMargin |
UIViewAutoresizingFlexibleLeftMargin |
UIViewAutoresizingFlexibleRightMargin;
UIViewContentMode
是默认值(应为UIViewContentModeScaleToFill
)。
'解决方案'我已经解决了这个问题
这实际上并没有解决这个问题,但我现在使用0.1%的不透明度来代替0%的不透明度。有效地隐藏元素而不会引起问题,并且fadeins / fadeouts运行良好。
疑难解答
为了确保我没有在所有非控件视图的顶部绘制电影,我将AVPlayerLayer
移到了另一个视图videoView
:
UIView(self.view)\ | UIView(videoView) | UIImageView (ad banner) | UIImageView (another ad banner) | ... | UIView(controlsView)\ * | UIView [some movie player controls] | UIView [some more movie player controls] *
我明确地致电sendSubviewToBack:videoView
和bringSubviewToFront:controlsView
,但仍然没有爱。如果我在第一次将它们添加到视图层次结构时不调用setHidden:YES
,我可以在屏幕上看到重叠式广告。踢球者是这样的:广告也会在正确的时间消失(响应我的动画块中的overlayImage.alpha = 0.0f
),所以我知道我的动画块很好。
以下是将广告横幅添加到我的电影播放器视图中的代码段:
for(MyCustomAdBannerClass *overlay in overlays)
{
UIImageView *overlayImage =
[[UIImageView alloc] initWithImage:
[UIImage initWithData:
[NSData dataWithContentsOfURL:[overlay contentURL]]]];
UIViewAutoresizing autoresizingFlags =
UIViewAutoresizingNone;
CGFloat x, y, width, height;
width = [overlay width];
height = [overlay height];
// <snip> set x, y, autoresizing values of the above vars
[overlayImage setFrame:CGRectMake(x, y, width, height)];
[overlayImage setAutoresizingMask:autoresizingFlags];
[self.view addSubview:overlayImage];
}
for(UIView *subview in self.view.subviews)
{
if(subview == controlsView)
[self.view bringSubviewToFront:subview];
else if(subview == videoView)
[self.view sendSubviewToBack:subview];
else
[subview setHidden:YES];
}
以下是我用于添加叠加显示/消失回调的代码(overlay
是一个对象,其中包含有关何时显示叠加层的信息以及overlayImage
为UIImageView
的时间长度包含实际广告横幅):
[self.player
addBoundaryTimeObserverForTimes:[NSArray arrayWithObject:
[overlay startTime]]
queue:dispatch_get_main_queue()
usingBlock:^{
[UIView
animateWithDuration:0.7
animations:^{
overlayImage.alpha = 1.0f;
dispatch_time_t popTime =
dispatch_time(DISPATCH_TIME_NOW,
[overlay duration] * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(),
^(void){
[UIView
animateWithDuration:0.7
animations:^{
overlayImage.alpha = 0.0f;
[overlayImage removeFromSuperview];
}];
}];
}];
}];
正如我所说,overlayImage.alpha = 0.0f;
正在执行正确执行。
注意:刚刚首次添加视图时,我们尝试设置overlay.alpha = 0.5f;
而不是0.0f
。叠加FADES IN现在正常。因此,使视图100%不可见,以防止它在以后再次显示时,会出现一些时髦的事情。没有崩溃,所以它不只是引用解除分配的内存。
尝试的解决方法
我尝试将所有广告叠加层发送到videoView
后面,然后当每个广告叠加显示时,我调用了
[overlayImage removeFromSuperview];
[self.view insertSubview:overlayImage aboveView:videoView];
// dispatch hide animation
仍然没有显示它们,但在我省略setHidden:YES
时仍然正常淡出。
答案 0 :(得分:0)
请注意,我现在使用的是0.001f
而不是0.0f
,并且没有显示问题。我仍然想知道为什么会这样做。