【问题标题】:View shows up in Debug View Hierarchy, but NOT on device/sim视图显示在调试视图层次结构中,但不在设备/sim 上
【发布时间】:2015-06-10 21:22:12
【问题描述】:

这个问题让我非常困惑。我有一个小的 UIView 用来显示选择了哪个按钮。但是,它没有显示在我的应用中 - 它应该在“本地活动”下,但没有显示:

没关系,我想,我只需调试视图层次结构,看看它在哪里!它看起来正是它应该在的地方:

有人知道这里会发生什么吗?感谢您的帮助!

【问题讨论】:

  • 您希望在设备上看到什么?
  • 按钮的背景颜色是什么,可能是您的按钮覆盖了您想要显示为选中的视图。并描述您如何突出显示 UIView。
  • 背景是UIColor.clearColor(),从我的截图中很难看出,但是在3D视图中,它肯定在Activity Button之上。 Mike — 我希望看到活动按钮下方的白线,您可以在视图调试层次结构中看到,但在正在运行的应用程序上看不到。
  • 我很蠢——我修好了。我不确定为什么它在视图调试器中显示为顶部,但它在另一个 UIView 后面。
  • 对我来说,alpha 在“用户定义的运行时属性”中被设置为 0...

标签: ios iphone xcode view uiview


【解决方案1】:

我找到了造成这种情况的原因。

我在视图控制器中以编程方式创建了两个子视图(子视图 A 和子视图 B);尽管框架的大小和位置、alpha 值以及所有其他常见的可见性问题都已检查,但它们都没有出现在我的设备上。子视图 A 是视图控制器视图的子视图,子视图 B 是子视图 A 的子视图。在我的设备上两者都不可见,但是当我查看视图调试器层次结构时,我能够看到子视图 B(即使它的父视图,子视图 A,不可见)。

长话短说,当我删除更改子视图 A 的图层蒙版属性的代码时,该问题已得到解决。这是在图层上调用的确切方法:

extension CALayer {
    func round(corners: UIRectCorner, withRadius radius: CGFloat, withBounds: CGRect? = nil) {
        let path = UIBezierPath(roundedRect: withBounds ?? bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
        let mask = CAShapeLayer()
        mask.path = path.cgPath
        self.mask = mask
    }
}

我过去使用过这种方法没有任何问题,所以我确信问题是间接的,但也许这会在未来为某人指明正确的方向。

编辑

问题不仅在于上面显示的代码,还在于我在调用 round() 后更改了 Subview A 的框架。一旦我确定在给定最终位置和大小后只对子视图 A 进行 round() ,设备和调试器的所有问题都得到了解决。

【讨论】:

  • 这件事发生在我身上
  • 这也发生在我身上。对我有用的解决方案是将视图子类化并在layoutSubviews() 中进行圆角处理,如下所述:stackoverflow.com/a/27293815/1245293
  • 谢谢,您为我节省了大量时间
  • 哇,我也遇到了同样的问题,而且是圆角!!!!!!
【解决方案2】:

我很蠢——我修好了。我不确定为什么它在视图调试器中显示为顶部,但它在另一个 UIView 后面。

【讨论】:

  • 我遇到了这种情况,我在转换中重用了代码,将我的视图 alpha 设置为 0,哈哈。
  • 我也有同样的问题。尝试了所有的东西.. 就像制作 alpha 1,隐藏属性设置为 false,通过 [[UIApplication sharedApplication].keyWindow bringSubviewToFront:yourSubview] 带到所有其他视图的前面。如果有人找到,请向我推荐其他解决方案。
  • @KyleBashour:你是怎么发现的?
  • @NSGangster 哇,这正是我遇到的问题。谢谢你提出来。绝对值得注意的是,零 alpha 的东西会出现在视图调试器中,但不会出现在应用程序中。
  • 你是如何提出你的观点的?
【解决方案3】:

我在 Xcode 9 中遇到了同样的问题。原因是我在 viewDidLoad 中将视图的 alpha 设置为 0,但没有将 alpha 设置回 1.0。 出于某种原因,Debug View Hierarchy 显示它的 alpha 为 1.0...

【讨论】:

  • 这里也一样。对我来说,屏幕的动画将 alpha 设置为 0,这将使视图显示在视图调试器中,但不在设备中。
【解决方案4】:

我遇到了同样的问题,但是当我重新连接插座时,它又开始工作了。

【讨论】:

    【解决方案5】:

    在我的例子中,不可见视图 A 有一个父视图 B,还有一些设置 layer.mask 到 B

    CAGradientLayer *layer = [CAGradientLayer layer];
    CGFloat ratio = 0.05;
    
    layer.frame = CGRectMake(0, 0, kScreenWidth, B.height);
    layer.colors = @[(__bridge id)[[UIColor blackColor] colorWithAlphaComponent:0.0].CGColor, (__bridge id)[UIColor blackColor].CGColor];
    layer.locations = @[@0, @(ratio), @1];
    
    B.layer.mask = layer
    

    但是此时B.height等于0,所以我把这些代码放在layoutSubviews中执行,就可见了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-03
      • 2017-07-11
      • 2023-02-16
      • 2018-09-14
      • 2018-10-24
      • 2017-10-03
      相关资源
      最近更新 更多