【问题标题】:Swift: remove layer, without removing UIView in UITableViewCellSwift:删除层,不删除 UITableViewCell 中的 UIView
【发布时间】:2015-08-14 09:20:46
【问题描述】:

我有带有UIView 的 UITableViewCell。 我做了一些 CABasicAnimation 并将其附加到新的 CAShapeLayer,然后我将此图层添加到我的 UITableViewCell 中的超级图层:

self.layer.addSublayer(myLayer!)

除了 myLayer(和他的动画)显示在我的 UIView 上方之外,一切都很好。 我希望该标签低于UIView

我通过以同样的方式添加我的UIView 层来实现这一点:

self.layer.addSublayer(myViewLayer!)

在这种情况下,我的UIView 图层位于带有动画的 CAShapeLayer 的顶部。

但是我有一个问题,我需要删除 UIView 层 - myViewLayer 因为它在滚动时违反了 UIView 的宽度。

动画完成后,我需要移除图层,我可以轻松移除 CAShapeLayer - myLayer。

myLayer?.removeFromSuperlayer()

但是当我尝试对myViewLayer 做同样的事情时,我的 UIView 也被删除了。但我不希望这样,我需要我的 UIView 在屏幕上和我的视图层次结构中。

我不明白为什么,如果查看 self.layer.sublayers 我看到了这个(在添加层之前):

[<CALayer: 0x7fd1f0d4fe40>, <CALayer: 0x7fd1f0ddc950>]

在动画完成并移除 myLayer 之后:

[<CALayer: 0x7fd1f0d4fe40>, <CALayer: 0x7fd1f0ddc950>, <CAGradientLayer: 0x7fd1f0de3660>]

如您所见,CAGradientLayer 是我的 UIView 的一层。所以,在我手动将它添加到子层数组之前,我没有它。如何在不删除 UIView 的情况下删除它?

或者如何在 UIView 下添加 myLayer?

编辑

简而言之,我在动画之前就有了这个层级:

[<CALayer: 0x7fd1f0d4fe40> <- (I think this is UITableViewCell layer), <CALayer: 0x7fd1f0ddc950> <- (then, this is UITableViewCell content view layer)]

同时,我有这个视图层次结构:

UITableViewCell -> 内容视图 -> UIView

我需要在 UIView 下方添加带有动画的新层(我希望 UIView 部分覆盖带有动画的新层)。我该怎么做?

我在 UITableView 层层次结构中没有我的 UIView 层,所以我不能只使用 addLayer:below: 等添加带有动画的层。

【问题讨论】:

    标签: ios iphone swift uiview calayer


    【解决方案1】:

    您可以通过设置在UIView.layer下方添加myLayer

    myLayer.zPosition = -1

    【讨论】:

    • 如您所见,self.layer.sublayers 开头没有UIView.layer,但如果我添加它,剩下的麻烦就来了。
    • 在 iOS 上,每个 UIView 都有一个层。所以 self.view.layer 是你的视图对象的层。最初,它没有子层。
    • 是的,你是对的,它没有图层,但是这个 self.view 有子视图(我的 UIView - 有 myViewLayer 图层)。我再提一次,这个 UIView 层不在 self.view.layer.sublayers 中。
    • 我很困惑。您不应该混合图层和视图。 UIView 带有一层。您可以将图层添加到该图层,并更改它们的 z 顺序。不要将来自其他 UIView 的图层添加到该图层或其任何子图层。
    • 我在我的问题中添加了编辑部分,希望它能澄清一些事情。顺便说一句,myLayer.zPosition = -1 使我的myLayer 不可见(我认为它在 UITableViewCell 本身下方)
    【解决方案2】:

    我发现了问题。我犯了一个简单的错误。我使用了self.layer.sublayers,但我必须使用self.contentView.layer.sublayers,这是我的错误。

    当我发现这一点时,我能够解决另一个问题并使用addLayer:below:

    因此,如果您没有看到必须在对象的子层中的层,则意味着您正在查看错误的位置,请想想它可能在哪里,然后您会找到它,就像在 UITableView 中一样需要使用 contentView。

    【讨论】:

      【解决方案3】:

      下面的示例也可以解决您的问题。

      第一个解决方案:

      self.avPlayerLayer.zPosition = 0 // or -1
      self.view.layer.addSublayer(self.avPlayerLayer)
      

      或第二种解决方案

      self.view.layer.insertSublayer(self.avPlayerLayer, below: self.button1.layer)
      

      【讨论】:

      • 感谢您的回答,但正如我所说,问题出在错误的“根”层。我忘记了 contentView 层,只使用了 self.view.layer。我想删除这个问题,但已经有 2 个答案(没有我自己的),所以我留下了它,以防有人遇到同样的问题。无论如何,谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-30
      • 2020-04-28
      • 2020-10-29
      • 1970-01-01
      • 2018-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多