【问题标题】:Can I align a button's label with its layout margins?我可以将按钮的标签与其布局边距对齐吗?
【发布时间】:2020-06-24 14:16:17
【问题描述】:

左对齐UIButton 的标题的一种方法是将contentHorizontalAlignment 设置为.left(或.leading)。但这会使标题与按钮的左边缘齐平,没有边距。添加一些边距的常用方法是设置contentEdgeInstets

但我的按钮从屏幕的一个边缘延伸到另一个边缘,所以我希望左右边距兑现layoutMargins。这些边距可能会随着视图大小的调整或设备的旋转而改变。

有没有办法设置按钮的插图来观察这些边距?或者我应该从自定义视图创建一个按钮,在其中我可以使用自己的标签并将其锚定到layoutMarginsGuide

【问题讨论】:

    标签: ios uibutton uikit


    【解决方案1】:

    我目前最好的答案是:不,如果没有子类化,这是不可能的。

    我目前使用的子类实现很简单:

    class LayoutMarginRespectingButton: UIButton {
        override func layoutSubviews() {
            super.layoutSubviews()
    
            contentEdgeInsets = layoutMargins
        }
    }
    

    【讨论】:

      【解决方案2】:

      子类按钮可能对您有用...

      class RespectSuperviewMarginButton: UIButton {
      
          override func layoutSubviews() {
              super.layoutSubviews()
              if let sv = superview {
                  contentEdgeInsets.left = sv.layoutMargins.left
              }
          }
      
      }
      

      【讨论】:

      • 是的,看起来就是这样。不过,这比我想象的要简单,谢谢。虽然我可能只是添加自己的标签并将其固定到按钮的布局边距,而不是通过视图层次结构“向上”查找。
      【解决方案3】:

      我想您可以使用 titleEdgeInsets 手动设置按钮的边距以匹配取消按钮的插图。

      看看下面,除了origin.y和titleEdgeInsets之外,这两个按钮完全一样:

      let view = UIView(frame: CGRect(x: 0, y: 0, width: 400, height: 400))
      view.backgroundColor = .white
      
      let button = UIButton(frame: CGRect(x: 40, y: 40, width: 200, height: 80))
      button.setTitle("Some really long title", for: .normal)
      button.backgroundColor = .red
      button.setTitleColor(.black, for: .normal)
      
      let button2 = UIButton(frame: CGRect(x: 40, y: 160, width: 200, height: 80))
      button2.setTitle("Some really long title", for: .normal)
      button2.backgroundColor = .red
      button2.setTitleColor(.black, for: .normal)
      button2.titleEdgeInsets = UIEdgeInsets(top: 20, left: 20, bottom: 20, right: 20)
      
      
      view.addSubview(button)
      view.addSubview(button2)
      

      它给出以下结果:

      希望这会有所帮助:)

      【讨论】:

      • 是的,除了硬编码这些插图意味着它们不会响应更新边距的旋转和重新调整大小。
      • How about trying something like this 确定插入金额?
      • 谢谢,但我认为如果我必须监控布局更改以更新插图,我宁愿添加自己的标签并将其固定到 layoutMarginsGuide
      最近更新 更多