从 UIButton 超级视图访问 Stack 视图

Access the Stack view from a UIButton super view

我试图通过它所属的堆栈视图获取 UIButton 的 y 坐标位置。我在程序中需要这个值来将按钮的位置映射到不同的坐标系。

这是我的代码,它将从堆栈视图中获取按钮的 y 值:

p_tilePosition.x = round(self.layer.position.x / (self.frame.size.width + 8.0))// The 8 here is the standard spacing between sibling views
        let testView = self.superview
        if let yPosition = self.superview?.layer.position.y{
            p_tilePosition.y = round(yPosition / (self.frame.size.height + 8.0))
        }

(注意这是UIButton的子类,当UIButton被初始化时,会运行通过这段代码创建映射)

但是,我发现 self.superview 是零。我对此感到困惑,因为我认为按钮的超级视图是按钮所在的堆栈视图?不是这样吗?我怎样才能通过在初始化时获取堆栈的 y 位置来获取按钮的 y 位置?

首先 - UIButton 初始化时没有任何超级视图。避免在初始化期间进行任何布局。事实上,如果它依赖于 superview 或任何其他不属于 UIView 的组件。最好在视图控制器的 viewDidLoadviewWillLayoutSubviewsviewDidLayoutSubviews 中进行布局。

其次 - 如果您想将任何视图的位置转换为其他视图或主视图的坐标 window,您可以使用 UIView.convert( 来: )一家人。例如

let postion = label1.convert(CGPoint.zero, to: nil)

将在主 window 中为您提供按钮的来源。

!!! 请注意,我请求的不是 label1.frame.origin,而是 CGPoint.zero,在标签的内部坐标中,标签的原点是 (0, 0).

(老实说我应该转换 label1.bounds.origin,但它几乎总是 (0,0) )

您可以通过以下方式获得相同的结果:

let postion = label1.superview.convert(label1.frame.origin, to: nil)