【问题标题】:Bringing a subview to be in front of all other views将子视图置于所有其他视图之前
【发布时间】:2012-11-01 17:34:10
【问题描述】:

我目前正在将广告提供商集成到我的应用中。当广告展示但完全不成功时,我希望在广告前放置一条淡入淡出的消息。

我创建了一个函数,将子视图添加到当前视图并尝试使用

将其置于最前面
[self.view bringSubviewToFront:mySubview]

该函数在广告加载的通知时触发(通知来自广告提供商的 SDK)。但是,我的子视图并没有出现在广告前面。我想这是广告提供商故意让这变得困难的,但无论如何我都希望这样做。我目前正在与提供商讨论是否可以允许这样做。不过暂时我只是想看看有没有可能。

无论如何我可以强制我的子视图成为最顶层的视图,这样它就不会被任何东西阻挡?

【问题讨论】:

    标签: ios uiview subview


    【解决方案1】:

    试试这个:

    self.view.layer.zPosition = 1;
    

    【讨论】:

    • 感谢您的回答。对地图图钉问题很有用(我想强制一个在其他人之上)
    • 我能问一下你为什么在这个问题发布 3 年后才发这个回复吗?
    • 我在解决方案 3 年后才搜索 =)
    • 很遗憾这不能改变手势响应顺序。
    • 这只是把视图放在前面,而不是所有的手势和触摸事件。因此,当用户尝试触摸视图时,它会触摸其他视图。 @jere 的解决方案是正确的。
    【解决方案2】:

    如果广告提供者的视图不是添加到self.view 而是添加到[UIApplication sharedApplication].keyWindow 之类的东西怎么办?

    尝试类似:

    [[UIApplication sharedApplication].keyWindow addSubview:yourSubview]
    

    [[UIApplication sharedApplication].keyWindow bringSubviewToFront:yourSubview]
    

    【讨论】:

    • 不适用于 iAd 横幅视图...这是一个常见的“需要置顶”问题。 (非 VC 中不允许使用 iAd)
    • 或 [parentview bringSubviewToFront:yourSubview] ,其中 parentview 是子视图的中间视图
    【解决方案3】:

    Jere 回答的 Swift 2 版本:

    UIApplication.sharedApplication().keyWindow!.bringSubviewToFront(YourViewHere)
    

    斯威夫特 3:

    UIApplication.shared.keyWindow!.bringSubview(toFront: YourViewHere)
    

    斯威夫特 4:

    UIApplication.shared.keyWindow!.bringSubviewToFront(YourViewHere)
    

    希望它能为某人节省 10 秒! ;)

    【讨论】:

    • 如果我想把 keyWindow 本身放在前面怎么办?我面临一个问题,keyWindow 出于某种原因留在后面...
    【解决方案4】:

    我曾经需要这个。我创建了一个自定义 UIView 类 - AlwaysOnTopView

    @interface AlwaysOnTopView : UIView
    @end
    
    @implementation AlwaysOnTopView
    
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
        if (object == self.superview && [keyPath isEqual:@"subviews.@count"]) {
            [self.superview bringSubviewToFront:self];
        }
    
        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
    }
    
    - (void)willMoveToSuperview:(UIView *)newSuperview {
        if (self.superview) {
            [self.superview removeObserver:self forKeyPath:@"subviews.@count"];
        }
    
        [super willMoveToSuperview:newSuperview];
    }
    
    - (void)didMoveToSuperview {
        [super didMoveToSuperview];
    
        if (self.superview) {
            [self.superview addObserver:self forKeyPath:@"subviews.@count" options:0 context:nil];
        }
    }
    
    @end
    

    让你的视图扩展这个类。当然,这只确保子视图高于其所有同级视图。

    【讨论】:

    • 这太棒了!
    【解决方案5】:

    据我所知,zposition 是最好的方法。

    self.view.layer.zPosition = 1;

    【讨论】:

      【解决方案6】:

      让我做一个结论。 在 Swift 5 中

      如果在最后添加视图,您可以选择将子视图添加到 keyWindow。 否则,您可以将SubViewToFront。

      let view = UIView()
      UIApplication.shared.keyWindow?.addSubview(view)
      UIApplication.shared.keyWindow?.bringSubviewToFront(view)
      

      您还可以设置 zPosition。但缺点是您无法更改手势响应顺序。

      view.layer.zPosition = 1
      

      【讨论】:

        【解决方案7】:

        在 c# 中,View.BringSubviewToFront(childView); YourView.Layer.ZPosition = 1; 两者都应该工作。

        【讨论】:

          【解决方案8】:

          Swift 4.2

          UIApplication.shared.keyWindow!.bringSubviewToFront(yourView)
          

          来源:https://developer.apple.com/documentation/uikit/uiview/1622541-bringsubviewtofront#declarations

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多