从UIButton超级视图访问堆栈视图

时间:2018-01-05 17:07:35

标签: ios swift uibutton uistackview

我试图通过它所属的堆栈视图获取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位置?

1 个答案:

答案 0 :(得分:1)

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

第二 - 如果您希望将任意视图的位置转换为其他视图或主窗口的坐标,则可以使用 UIView.convert(to :) 系列。例如

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

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

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

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

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

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