从 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 的组件。最好在视图控制器的 viewDidLoad、viewWillLayoutSubviews 或 viewDidLayoutSubviews 中进行布局。
其次 - 如果您想将任何视图的位置转换为其他视图或主视图的坐标 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)
我试图通过它所属的堆栈视图获取 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 的组件。最好在视图控制器的 viewDidLoad、viewWillLayoutSubviews 或 viewDidLayoutSubviews 中进行布局。
其次 - 如果您想将任何视图的位置转换为其他视图或主视图的坐标 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)