UIView显示订单问题?

时间:2011-06-01 07:34:34

标签: ios objective-c cocoa-touch uiimageview uiviewanimation

问题

在屏幕上绘制自定义电影播放器​​控制器(iOS 4)时,我使用AVPlayerLayer进行显示。我希望在播放器上添加一些叠加(广告横幅,播放器控件等)。目前,这与以下层次结构完全一致:

UIView(self.view)\
                 | UIView(controlsView)\
                 *                     | UIView [some movie player controls]
                                       | UIView [some more movie player controls]
                                       *

AVPlayerLayerself.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.0fview.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:videoViewbringSubviewToFront: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是一个对象,其中包含有关何时显示叠加层的信息以及overlayImageUIImageView的时间长度包含实际广告横幅):

[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时仍然正常淡出。

1 个答案:

答案 0 :(得分:0)

请注意,我现在使用的是0.001f而不是0.0f,并且没有显示问题。我仍然想知道为什么会这样做。