gpt4 book ai didi

ios - 使用自动布局检索 subview 的正确位置

转载 作者:可可西里 更新时间:2023-11-01 00:00:45 25 4
gpt4 key购买 nike

我想以编程方式将 View 放置在 Storyboard 中创建的所有 subview 的中心。

在 Storyboard 中,我有一个 View ,在垂直 StackView 内部,它具有填充全屏的约束,分布“等距”。在垂直堆栈 View 内部,我有 3 个水平堆栈 View ,约束高度 = 100,尾随和前导空格:来自 super View 的 0。分布也是“等距”。在每个水平堆栈 View 中,我有两个 View ,约束宽度和高度 = 100, View 是红色的。

到目前为止,很好,我有我想要的界面, enter image description here

现在我想检索每个红色 View 的中心,以在该位置放置另一个 View (实际上,它将是棋盘上的棋子...)

所以我这样写:

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var verticalStackView:UIStackView?

override func viewDidLoad() {
super.viewDidLoad()
print ("viewDidLoad")
printPos()
}

override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
print ("viewWillAppear")
printPos()
}

override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
print ("viewWillLayoutSubviews")
printPos()
}

override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
print ("viewDidLayoutSubviews")
printPos()
}

override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print ("viewDidAppear")
printPos()
addViews()
}


func printPos() {
guard let verticalSV = verticalStackView else { return }
for horizontalSV in verticalSV.subviews {
for view in horizontalSV.subviews {
let center = view.convert(view.center, to:nil)
print(" - \(center)")
}
}
}

func addViews() {
guard let verticalSV = verticalStackView else { return }
for horizontalSV in verticalSV.subviews {
for redView in horizontalSV.subviews {
let redCenter = redView.convert(redView.center, to:self.view)
let newView = UIView(frame: CGRect(x:0, y:0, width:50, height:50))
//newView.center = redCenter
newView.center.x = 35 + redCenter.x / 2
newView.center.y = redCenter.y
newView.backgroundColor = .black
self.view.addSubview(newView)
}
}
}

}

有了它,我可以看到在 ViewDidLoad 和 ViewWillAppear 中,指标是 Storyboard的指标。然后在 viewWillLayoutSubviews、viewDidLayoutSubviews 和 viewDidAppear 中位置发生了变化。

在 viewDidAppear 之后(所以在所有 View 就位之后),我必须将 x 坐标除以 2 并添加类似 35 的东西(参见代码)以使新的黑色 View 正确居中于红色 View 中。我不明白为什么我不能简单地使用红色 View 的中心...为什么它适用于 y 位置?

最佳答案

我发现你的问题,更换

let redCenter = redView.convert(redView.center, to:self.view)

let redCenter = horizontalSV.convert(redView.center, to: self.view)

转换的时候,要从 View 的原始坐标转换过来,这里是horizo​​ntalSv

关于ios - 使用自动布局检索 subview 的正确位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44314549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com