iOS Swift-基于按钮框架的位置子视图(按钮位于垂直堆栈视图内)
更新 在rect和主视图之间添加转换方法后,Y位置正常,但X坐标在主视图外向右移动: 下面是转换方法前后的按钮框。主视图为414 x 896。下拉菜单会以某种方式向右移动,就像附加的图像一样。 stackView btnRect中的按钮框:(120.666666,0.0,293.3333,30.0) 主视图中的按钮框:cvtRect(241.33331190.01293.3333,30.0) 视图:可选(>) 目标。我想通过在按钮下方显示带有下拉选项的UIView来创建一个下拉列表。按钮位于垂直堆栈视图的内部。我将带有下拉选项的TableView添加到此下拉菜单UIView。我想单击一个按钮,并使此带有TableView的UIView显示在按钮的正下方。基本上遵循本教程,除了我的按钮在垂直堆栈视图中 问题。UIView和UIView中的TableView在单击按钮时显示ok。问题在于下拉菜单UIView的位置始终是同一原点X=120,Y=0 我就是这样做的:iOS Swift-基于按钮框架的位置子视图(按钮位于垂直堆栈视图内),swift,uiview,frame,uistackview,addsubview,Swift,Uiview,Frame,Uistackview,Addsubview,更新 在rect和主视图之间添加转换方法后,Y位置正常,但X坐标在主视图外向右移动: 下面是转换方法前后的按钮框。主视图为414 x 896。下拉菜单会以某种方式向右移动,就像附加的图像一样。 stackView btnRect中的按钮框:(120.666666,0.0,293.3333,30.0) 主视图中的按钮框:cvtRect(241.33331190.01293.3333,30.0) 视图:可选(>) 目标。我想通过在按钮下方显示带有下拉选项的UIView来创建一个下拉列表。按钮位于垂直
非常感谢您的按钮是stackView的子视图,因此它的框架相对于stackView的框架 要在视图的坐标空间中获取其帧(rect),需要使用
.convert
。将此操作分配给stackView中的一个按钮:
编辑修复了代码示例。。。我在发帖之前没有检查过
class ConvertViewController: UIViewController {
@IBOutlet var dropDownView: UIView!
@IBAction func didTap(_ sender: Any) {
guard let btn = sender as? UIButton else {
fatalError("Sender is not a button!")
}
guard let sv = btn.superview as? UIStackView else {
fatalError("Sender is not in a stackView!")
}
let btnRect = btn.frame
let cvtRect = sv.convert(btn.frame, to: view)
print("button frame in stackView:", btnRect)
print("button frame in main view:", cvtRect)
let dropDownRect = dropDownView.bounds
let cvtCenterX = cvtRect.origin.x + (cvtRect.size.width / 2.0)
let viewX = cvtCenterX - (dropDownRect.width / 2.0)
let newOrigin = CGPoint(x: viewX, y: cvtRect.minY + cvtRect.height)
dropDownView.frame.origin = newOrigin
}
}
如果查看调试控制台中的输出,您应该会看到如下内容:
button frame in stackView: (0.0, 114.0, 46.0, 30.0)
button frame in main view: (164.5, 489.5, 46.0, 30.0)
如您所见,我的stackView中第四个按钮的矩形(框架)的原点为0.0、114.0
,但将其转换到我的视图
坐标空间后,矩形的原点为164.5489.5
现在,您可以相对于转换的rect定位“下拉列表”
作为旁注,您可能想看看
uipopopresentationcontroller
非常感谢,这很有帮助,我现在非常接近了。我添加了let btnRect=btn.frame和let cvtRect=btn.convert(btn.frame,to:view)。现在我在正确的Y位置,只是X坐标现在关闭了。btnRect:(120.666666,0.0和之后。转换cvtRect(241.33331190.0,因此此X=241使下拉列表位于视图之外,即:视图:可选(同样感谢您的建议,PopoverPresentationController看起来很棒,我将来会使用它。我仍然对上面的视图、子视图和帧坐标感兴趣:-)使它们移动的是按钮的左边缘。x=241
。您可以对x
位置执行任何计算…例如,如果您想要“下拉列表”,请执行视图要在按钮下方居中,您可能会得到转换的矩形的中心:让cvtCenterX=cvtRect.origin.x+(cvtRect.size.width/2.0)
然后使用让视图x=cvtCenterX-(dropDownView.size.width/2.0)定位视图
@Bosniak-对不起……我没有测试就输入了那个代码。我更新了我的答案——现在应该是准确的了。
button frame in stackView: (0.0, 114.0, 46.0, 30.0)
button frame in main view: (164.5, 489.5, 46.0, 30.0)