【问题标题】:Swift - Automatically adding a button to the right of the button just addedSwift - 在刚刚添加的按钮的右侧自动添加一个按钮
【发布时间】:2016-03-29 21:21:57
【问题描述】:

我设置了 UIScrollView,并且正在使用 addSubView 向其中添加 5 个按钮。这是我的 viewDidLoad 中的代码。

    let codedButton:UIButton = UIButton(frame: CGRectMake(0, 0, 100, 50))
    codedButton.backgroundColor = UIColor.redColor()
    codedButton.setTitle("Button 1", forState: UIControlState.Normal)
    codedButton.addTarget(self, action: #selector(ViewController.buttonAction(_:)), forControlEvents: UIControlEvents.TouchUpInside)
    codedButton.tag = 1
    self.buttonScrollView.addSubview(codedButton)
    
    let codedButton2:UIButton = UIButton(frame: CGRectMake(110, 0, 100, 50))
    codedButton2.backgroundColor = UIColor.redColor()
    codedButton2.setTitle("Button 2", forState: UIControlState.Normal)
    codedButton2.addTarget(self, action: #selector(ViewController.buttonAction(_:)), forControlEvents: UIControlEvents.TouchUpInside)
    codedButton2.tag = 2
    self.buttonScrollView.addSubview(codedButton2)

(一直到 5。)

我需要帮助的问题是......最终,这些按钮将被动态显示。不仅仅是固定的 5 个。

如何调整 CGRectMake 的 X 值以自动将新按钮“浮动”到刚刚创建的按钮的右侧?在上面的代码中,我明确说明了 X 的位置,但是一旦这些按钮在代码中动态创建,它将无法正常工作。

编辑 为了澄清我上面的问题: 我附上了一张图片。请注意按钮如何始终水平堆叠/下一个,无论是 2 3 4 还是 5。这些按钮将动态显示。因此,在我上面提供的代码尝试中,它不起作用,因为它明确设置了按钮在 X 轴上的放置位置。

我需要修改我的代码以执行如下图所示。

【问题讨论】:

  • .. 请更详细地描述您想要什么?您希望在代码中添加按钮时动态调整其大小?
  • .. 还是要将新按钮放在最后一个按钮旁边?
  • @Joe 你能实现如上图描述的代码吗?
  • @Vaibhav Jhaveri - 我使用了 Dan Levy 解释的堆栈视图。
  • @Joe 如果可能的话,你能分享一下实现吗?

标签: swift uiscrollview uibutton cgrectmake


【解决方案1】:

我看到您正在以编程方式执行此操作。我对代码无能为力,但故事板中的堆栈视图很棒。我的应用中有一个功能,我有 4 个按钮,但用户可能只能看到 4 个按钮中的 2 个。

1) 将按钮水平添加到情节提要中(它们不需要完全对齐,只要 Xcode 可以识别它是水平的而不是垂直的即可。

2) 选择所有 5 个按钮

3) 点击Xcode右下角的stack view按钮(这个按钮有4条水平线,有一个向下的箭头。

4) 在属性检查器中,选择水平为轴,对齐为中心,按比例填充,玩转间距,模式选择比例填充。

5) 在 Swift 文件中,您可以使用 button.hidden = true / false 来添加或隐藏按钮

注意:请记住,我上次检查时堆栈视图仅适用于 iOS 9

【讨论】:

  • 我将对此进行更多研究。根据 macrumors,ios9 在 75% 的 ios 设备上处于活动状态,因此这很可能是一个可行的解决方案。
  • 对!我在商店里推出的另一个应用程序仅适用于 iOS 9 用户,但无论如何大多数人都在使用它
【解决方案2】:

下面是一个循环示例,您可以将其添加到一个按钮的当前实现中以添加任意数量的按钮,在此示例中,按钮的数量取决于您添加到的按钮名称的数量名为“buttonList”的数组。对于循环的每次迭代,它将根据 ButtonList 中的文本命名按钮,并将标记设置为其在数组中的索引。然后它会计算你的框架的 x 坐标,在这个例子中,我将每个按钮设置为 100px 宽,中间有 10px 的空间,从 x 坐标位置 0 开始。如果你想在第一个按钮和在计算 x 坐标时,视图的前沿只是增加索引: let xCoord = CGFloat(index*buttonWidth + (index+1)*buttonSpace)

随着添加更多按钮,您还需要增加滚动视图的大小以适应按钮,这是我用于设置滚动视图宽度的计算(如果向滚动添加前导空间,则将 buttonSpace 宽度增加 1查看):buttonScrollView.contentSize = CGSizeMake(CGFloat((ButtonList.count * buttonWidth) + ((ButtonList.count + 1) * buttonSpace)), 50)

var ButtonList = ["Button 1", "Button 2", "Button 3"]
let buttonWidth = 100
let buttonSpace = 10
for (index,ButtonText) in ButtonList.enumerate(){
    //calculate the x coordinate of each button
    let xCoord = CGFloat(index*buttonWidth + index*buttonSpace)
    let codedButton:UIButton = UIButton(frame: CGRectMake(xCoord, 0, 100, 50))
    codedButton.backgroundColor = UIColor.redColor()
    codedButton.setTitle(ButtonText, forState: UIControlState.Normal)
    codedButton.addTarget(self, action: #selector(ViewController.buttonAction(_:)), forControlEvents: UIControlEvents.TouchUpInside)
    codedButton.tag = index
    self.buttonScrollView.addSubview(codedButton)
    }

【讨论】:

  • 我在这个项目上工作已经有一段时间了,我发布了这个问题,但是当我重新访问它时,我会尝试这个方法!感谢您非常彻底的回复。
  • 不幸的是,我注意到这个问题已经存在几个月了,但我偶然发现了这篇文章,希望在我自己的项目中实现相同的按钮布局,所以我想我会从那里发布一个解决方案似乎不是一个。
【解决方案3】:

我不知道这是否是你所要求的。如果不是,请发表评论。

创建一个counter 并命名您的按钮..

button.name = "name\(counter)"

使用..获取最后一个按钮的位置。

let position = self.childNodeWithName("name\(counter)")?.position

设置新按钮的位置..

newButton.position = CGPointMake(position.x + newButton.frame.size.width/2 + oldButton.frame.size.width/2, position.y)

.. 您的新按钮现在设置为您添加的最后一个按钮

【讨论】:

  • 我不确定如何在我目前拥有的代码中实现您的代码。我还编辑了我的初始帖子,以便更清楚地了解我需要实现的目标。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-07
  • 1970-01-01
  • 2017-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
相关资源
最近更新 更多