iOS Swift-基于按钮框架的位置子视图(按钮在垂直堆栈视图内部)

问题描述 投票:0回答:1

更新

在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。

这是我尝试做到的方式:

  1. 我有四行垂直堆叠
  2. 在第四行中,我具有标签(宽度= 120与上面的X坐标几乎相同)和一个触发UIView显示的button
  3. 我正在使用按钮显示下拉列表(基本上是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出现在按钮框(X,Y,宽度,高度)的正下方。但是,尽管button在第4行中应该具有更高的Y值位置,但是button框架始终位于X = 120,Y = 0,因此我的UIView始终固定在应该位于模拟下拉菜单的按钮上方的此位置。

问题1。下拉式UIView的位置我缺少什么?为什么当按钮位于“垂直堆栈视图”的第四行中时,按钮位置Y = 0,而Y位置明显更高?我还尝试将下拉菜单仅居中放置在屏幕中央,但这也不起作用。

2。我从网络开发世界过渡到iOS开发,并且在我的职业生涯中经常使用下拉菜单。我应该只使用Picker View吗?还是警报?在Swift应用程序中向用户提供互斥选项列表的最常见和最标准的方法是什么?

非常感谢

swift uiview frame uistackview addsubview
1个回答
0
投票

您的按钮是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

© www.soinside.com 2019 - 2024. All rights reserved.