视图显示在调试视图层次结构中,但不显示在 device/sim
View shows up in Debug View Hierarchy, but NOT on device/sim
这个问题严重困扰着我。我有一个小的 UIView,我用它来显示选择了哪个按钮。但是,它没有出现在我的应用程序中 — 它应该在 "Local Activities," 下但没有出现:
没关系,我想,我将调试视图层次结构并查看它在哪里!它看起来就像它应该在的位置:
有人知道这里会发生什么吗?感谢您的帮助!
我很笨——我修好了。我不确定为什么它在视图调试器中显示在顶部,但它在另一个 UIView 后面。
我已找到导致此问题的原因。
我在视图控制器中以编程方式创建了两个子视图(子视图 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() 后更改子视图 A 的框架这一事实。一旦我确定只有 round() 子视图 A 在它被赋予了它的最终位置和大小之后,设备和调试器的所有问题都得到了解决。
我在 Xcode 9 中遇到了同样的问题。我的原因是我在 viewDidLoad 中将视图的 alpha 设置为 0,但没有将 alpha 设置回 1.0。
出于某种原因,Debug View Hierarchy 显示它的 alpha 为 1.0...
我遇到了同样的问题,但是当我重新连接插座时,它又开始工作了。
在我的例子中,不可见视图 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
里面执行,就可以看到了
这个问题严重困扰着我。我有一个小的 UIView,我用它来显示选择了哪个按钮。但是,它没有出现在我的应用程序中 — 它应该在 "Local Activities," 下但没有出现:
没关系,我想,我将调试视图层次结构并查看它在哪里!它看起来就像它应该在的位置:
有人知道这里会发生什么吗?感谢您的帮助!
我很笨——我修好了。我不确定为什么它在视图调试器中显示在顶部,但它在另一个 UIView 后面。
我已找到导致此问题的原因。
我在视图控制器中以编程方式创建了两个子视图(子视图 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() 后更改子视图 A 的框架这一事实。一旦我确定只有 round() 子视图 A 在它被赋予了它的最终位置和大小之后,设备和调试器的所有问题都得到了解决。
我在 Xcode 9 中遇到了同样的问题。我的原因是我在 viewDidLoad 中将视图的 alpha 设置为 0,但没有将 alpha 设置回 1.0。 出于某种原因,Debug View Hierarchy 显示它的 alpha 为 1.0...
我遇到了同样的问题,但是当我重新连接插座时,它又开始工作了。
在我的例子中,不可见视图 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
里面执行,就可以看到了