UIView显示顺序问题?

| 问题 在屏幕上绘制自定义电影播放器​​控制器(iOS 4)时,我使用
AVPlayerLayer
进行显示。我希望在播放器顶部合成一些叠加层(广告横幅,播放器控件等)。目前,这在以下层次结构中绝对可以正常工作: UIView(self.view)\\                  | UIView(controlsView)\\                  * | UIView [某些电影播放器​​控件]                                        | UIView [更多电影播放器​​控件]                                        *
AVPlayerLayer
self.view
的子层。在播放器负载下,我首先将图层添加到
self.view
,然后在
controlsView
上调用
bringSubviewToFront:
,然后检测其上的轻击并以编程方式在计时器/任何地方显示/淡出。这里没问题。 现在,我已经支持动态获取和显示广告内容,我想建立以下层次结构: UIView(self.view)\\                  | UIImageView(广告横幅)                  | UIImageView(另一个广告横幅)                  | ...                  | UIView(controlsView)\\                  * | UIView [某些电影播放器​​控件]                                        | UIView [更多电影播放器​​控件]                                        * 在播放器负载下,我要做的是将我的
AVPlayer
实例附加到一些
addBoundaryTimeObserverForTimes:queue:usingBlock:
调用,以在适当的时间淡入和淡出广告横幅。在执行此操作时,我将
UIImageView
加到
self.view
中作为子视图,没有明确的顺序(因此应该将它们绘制在所有其他内容的顶部),并在其上添加
setHidden:YES
。 我已经
NSLog
并且正确执行了这些淡入淡出块,分别在广告横幅上设置了分别显示和隐藏的ѭ12show和ѭ13,,但是即使将视图显示的
UIImage
显式设置为已知的有效本地图像,并且帧设置为
(0, 0, 320, 480)
,并设置
autoresizingMask
UIViewAutoresizingFlexibleTopMargin  |
UIViewAutoresizingFlexibleLeftMargin |
UIViewAutoresizingFlexibleRightMargin;
默认值为
UIViewContentMode
(应为
UIViewContentModeScaleToFill
)。 我已经解决了这个“解决方案” 这实际上并不能解决所有问题,但是我现在使用0.1%的不透明度代替0%的不透明度。有效隐藏元素而不引起问题,并且淡入/淡出效果良好。 故障排除 为了确保我没有在所有非控件视图的顶部绘制影片,我将ѭ0moved移动到了另一个视图
videoView
: UIView(self.view)\\                  | UIView(videoView)                  | UIImageView(广告横幅)                  | UIImageView(另一个广告横幅)                  | ...                  | UIView(controlsView)\\                  * | UIView [某些电影播放器​​控件]                                        | UIView [更多电影播放器​​控件]                                        * 我明确称呼
sendSubviewToBack:videoView
bringSubviewToFront:controlsView
,但仍然没有爱。如果我在第一次将叠加层广告添加到视图层次结构中时未调用“ 10”,就可以在屏幕上看到重叠式广告。关键在于:广告也会在正确的时间消失(以响应我的动画块中的
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];
                              }];
                          }];
                }];
}];
就像我说的那样,“ 31”调用正在正确执行。 注意:刚添加视图时,尝试将
overlay.alpha = 0.5f;
设置为
0.0f
。叠加层现在可以正常淡入。因此,将视图设为100%不可见是一件很时髦的事情,这使视图无法在以后再次显示。没有崩溃,因此它不只是引用已分配的内存。 尝试的解决方法 我尝试将所有广告叠加层发送到
videoView
之后,然后在显示每个叠加层时,我打电话给
[overlayImage removeFromSuperview];
[self.view insertSubview:overlayImage aboveView:videoView];
// dispatch hide animation
仍然没有显示它们,但是当我省略“ 10”时,仍然可以正确地淡出。     
已邀请:
        请注意,我现在使用的是
0.001f
而不是
0.0f
,并且没有显示问题。我仍然很想弄清楚为什么这样做。     

要回复问题请先登录注册