代码之家  ›  专栏  ›  技术社区  ›  philm

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

  •  1
  • philm  · 技术社区  · 7 年前

    我试图通过它所属的堆栈视图获取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被初始化时,它将运行此代码来创建映射)

    然而,我发现了自己。superview为零。我对此感到困惑,因为我认为按钮的superview是按钮所在的堆栈视图?不是这样吗?如何通过在初始化时获取堆栈的y位置来获取按钮的y位置?

    1 回复  |  直到 7 年前
        1
  •  1
  •   MichaelV    7 年前

    首先,在UIButton初始化时没有任何superview。避免在初始化期间进行任何布局。实际上,如果它依赖于superview或任何其他不属于UIView的组件。更好的布局方式 viewDidLoad视图 , 视图将布局子视图 viewDidLayoutSubviews视图 视图控制器的。

    第二,如果要将任何视图的位置转换为其他视图或主窗口的坐标,可以使用 UIView。转换(到:) 家庭Fo示例

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

    将在主窗口中为您提供按钮的原点。

    !!! 请注意,我请求的不是标签1。框架原点,但CGPoint。零,在标签的内部坐标中,标签的原点为(0,0)。

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

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

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