【问题标题】:Are UIViews duplicated when adding a subview again in Swift?在 Swift 中再次添加子视图时 UIViews 是否重复?
【发布时间】:2019-09-23 11:31:15
【问题描述】:

我想知道关于 UIView 的一些事情,并添加子视图...

假设我向 baseLayerView 添加了一个子视图:

  self.newBaseLayer.addSubview(self.usernameLabel)

如果我错了,UIView 层次结构/结构会纠正我,如下所示:

  • 新的BaseLayer

    • self.usernameLabel

然后在后面的代码中,我添加了另一个子视图:

  self.newBaseLayer.addSubview(self.dateLabel)

最后我再次添加用户名标签:

  self.newBaseLayer.addSubview(self.usernameLabel)

usernameLabel 是否会像这样重复或替换另一个:

  • 新的BaseLayer

    • self.usernameLabel
    • self.dateLabel
    • self.usernameLabel

  • 新的BaseLayer

    • self.dateLabel
    • self.usernameLabel

【问题讨论】:

  • 为什么不自己查看生成的层次结构,看看你得到了什么结果?这比输入这个问题要快。
  • 顺便说一句 - 这与图层有什么关系?这似乎只处理UIView
  • 如果你的代码是完整的 - 是的,你不是在谈论 CALayer 层次结构(至少你的代码中没有任何暗示) - 那么 绝对usernameLayer (令人困惑的名称选择)没有从层次结构中删除,为什么不会它不存在?或者你说的是哪个视图是front
  • 让我解释一下......因为@rmaddy 非常擅长,嗯,几乎所有事情。 (1)每个UIView都可以有子视图,每个人都有自己的能力有子视图。这就是视图层次结构。 (2) 一个UIView 有几个UIKit 子类,从图像视图到集合视图,再到导航视图,所以是的,它们继承自UIView。 (3) 每个 single UIView 都有一个 CALayer 。只需将其编码为myView.layer。 (4) 每个CALayer 都可以使用addSublayer 方法拥有自己的“层”层次结构。最后发表评论....
  • 让我们谈谈CALayer 和它们的子类——它们的运作方式与UIView 的运作方式非常相似。你可以有一个层次结构,CAShapeLayer,它可以绑定到UIBezierPath,“CA”表示“核心动画”。由于您清楚地使用addSubview 进行编码,因此我认为您不是在谈论层-但希望您可以看到UIViewnewBaseLayer 命名约定在您的问题方面令人困惑。也许在我的三个 cmets 中的某个地方,我澄清并回答了你的问题。如果没有,请更具体一些,我会尽我所能回答/评论

标签: ios swift uiview subview addsubview


【解决方案1】:

我猜我们在这里谈论的是 UIViews 而不是 Layers?!

在这种情况下,即使您多次调用 addSubview,usernameLabel 也只会添加一次。

为了避免任何歧义,这里有一些代码:

let baseView = UIView()
let dateLabel = UILabel()
let usernameLabel = UILabel()

override func viewDidLoad() {
    super.viewDidLoad()

    baseView.tag = 1
    usernameLabel.tag = 2
    dateLabel.tag = 3

    self.view.addSubview(self.baseView)

    self.baseView.addSubview(self.usernameLabel)
    self.baseView.addSubview(self.dateLabel)
    self.baseView.addSubview(self.usernameLabel)

    self.traverseViewHierarchy(view: self.baseView, level: 0)

}

private func traverseViewHierarchy(view: UIView, level: Int) {
    for _ in 0...level {
        print (" | ", terminator: "")
    }
    print ("view: \(view.tag)")
    for view in view.subviews {
        self.traverseViewHierarchy(view: view, level: level + 1)
    }
}

这会在提及视图中添加一些标签并在控制台中给出:

| view: 1
|  | view: 3
|  | view: 2

如您所见,usernameLabel 只添加了一次到视图层次结构中。

【讨论】:

  • 是的,我说的是 UIViews,谢谢你的回答!
猜你喜欢
  • 1970-01-01
  • 2016-10-12
  • 2020-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
相关资源
最近更新 更多