更新
在rect和main view之间添加了convert方法之后,Y位置可以,但是X坐标移到了main view的右侧:Dropdown view(subview) is off main view下面是转换方法前后的按钮框。主视图为414 x896。下拉菜单如右图所示,以某种方式向右移动。stackView中的按钮框btnRect:(120.66666666666666,0.0,293.3333333333333,30.0)主视图中的按钮框:cvtRect(241.33333333333331,190.0,293.3333333333333,30.0)视图:Optional(>)
目标。我想通过在按钮下方显示带有下拉选项的UIView来创建下拉列表。按钮位于“垂直堆栈视图”的内部。我向该下拉菜单UIView添加了带有下拉菜单选项的TableView。我想单击一个按钮,并使其内部带有TableView的UIView显示在按钮下方。基本上遵循本教程https://www.youtube.com/watch?v=D3DCPaEE4hQ,但我的按钮位于“垂直堆栈视图”内部。
单击按钮后,问题。 UIView和UIView中的TableView会显示确定。问题是下拉菜单UIView的位置始终是相同的原点X = 120,Y = 0。
这是我尝试做到的方式:
func addTransparentView(frames: CGRect)
{
let window = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
transparentView.frame = window?.frame ?? self.view.frame
//some of the stuff I tried to at least centre dropdownUIView
//transparentView.center.x = window?.center.x ?? self.view.center.x
//transparentView.center.y = window?.center.y ?? self.view.center.y
self.view.addSubview(transparentView)
tvPriority.frame = CGRect(x: frames.origin.x, y: frames.origin.y + frames.width, width: frames.width, height: 0)
//some of the stuff I tried to at least centre UIView
//tvPriority.center = verticalStackView.convert(verticalStackView.center, from:tvPriority)
//tvPriority.center.x = view.center.x
//tvPriority.center.y = view.center.y
self.view.addSubview(tvPriority)
tvPriority.layer.cornerRadius = 5
transparentView.backgroundColor = UIColor.black.withAlphaComponent(0.9)
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(removeTransparentView))
transparentView.addGestureRecognizer(tapGesture)
transparentView.alpha = 0
UIView.animate(withDuration: 0.4, delay: 0, usingSpringWithDamping: 1.0, initialSpringVelocity: 1.0, options: UIView.AnimationOptions.curveEaseInOut, animations: {self.transparentView.alpha = 0.5
self.tvPriority.frame = CGRect(x: frames.origin.x, y: frames.origin.y + frames.height, width: frames.width, height: 193)
}, completion: nil)
}
问题1。下拉式UIView的位置我缺少什么?为什么当按钮位于“垂直堆栈视图”的第四行中时,按钮位置Y = 0,而Y位置明显更高?我还尝试将下拉菜单仅居中放置在屏幕中央,但这也不起作用。
2。我从网络开发世界过渡到iOS开发,并且在我的职业生涯中经常使用下拉菜单。我应该只使用Picker View吗?还是警报?在Swift应用程序中向用户提供互斥选项列表的最常见和最标准的方法是什么?
非常感谢
您的按钮是stackView的子视图,因此其框架相对于stackView的框架。
要在视图的坐标空间中获得其框架(矩形),您将需要使用.convert
。将此操作分配给stackView中的按钮之一:
@IBAction func didTap(_ sender: Any) {
guard let btn = sender as? UIButton else {
fatalError("Sender is not a button!")
}
let btnRect = btn.frame
let cvtRect = btn.convert(btn.frame, to: view)
print("button frame in stackView:", btnRect)
print("button frame in main view:", cvtRect)
}
如果您在调试控制台中查看输出,则应该看到类似以下内容的内容:
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
,但是将其转换为我的view
坐标空间后,矩形的原点为164.5, 489.5
。
您现在可以相对于转换后的矩形放置“下拉列表”。
作为旁注,您可能需要查看UIPopoverPresentationController
。