【问题标题】:Access the Stack view from a UIButton super view从 UIButton 超级视图访问堆栈视图
【发布时间】:2018-01-05 17:07:34
【问题描述】:

我试图通过它所属的堆栈视图获取 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 是 nil。我对此感到困惑,因为我认为按钮的超级视图是按钮所在的堆栈视图?不是这样吗?如何通过在初始化时获取堆栈的 y 位置来获取按钮的 y 位置?

【问题讨论】:

  • 为什么不简单地使用convert 方法?

标签: ios swift uibutton uistackview


【解决方案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)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-09
  • 1970-01-01
  • 1970-01-01
  • 2011-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多