【问题标题】:programmatically set a button width and height以编程方式设置按钮的宽度和高度
【发布时间】:2018-02-16 02:49:37
【问题描述】:

我想以编程方式自定义UIButton。我的代码从这里开始:

class MyButton: UIButton {
    override func awakeFromNib() {
        super.awakeFromNib()

        layer.shadowRadius = 5.0
        ...
    }
}

现在我想为按钮定义一个恒定的宽度和高度,如何在代码中实现?

【问题讨论】:

  • 你尝试使用 self.frame 属性了吗?
  • 首先:不要。尽可能使用自动布局。其次,浏览文档,您将立即看到UIButton 的可用属性,名称告诉您该由谁来做。
  • @DávidPásztor,但是我有一个独特的样式按钮适用于整个项目,使用自动布局意味着我在任何地方都有我需要设置高度约束的按钮。所以,在我的情况下,我认为以编程方式自定义按钮比自动布局更好。
  • 所以你真的希望你的自定义按钮在所有屏幕上都具有相同的大小,无论屏幕是 iPhone SE 还是 iPad Pro 12.9?这很少是一个好主意。您也可以通过编程方式设置 Autolayout 约束,因此您无需在每次创建新按钮时都重新设置。

标签: ios swift swift3 uibutton


【解决方案1】:

我试图找到一种方法来创建一个方形按钮框。希望我没有来错地方,但是当我试图找到自己的解决方案时,它就像这样简单:

button.frame.size.width = 200
button.frame.size.height = 200

这当然适用于所有其他视图。

【讨论】:

  • KISS = 保持简单愚蠢。谢谢你的回答!!
【解决方案2】:

如果您的按钮从情节提要中设置了如下约束,并且您想更改按钮的宽度,那么这个答案很有帮助。

constraints set from the storyboard

Safe Area.trailing = Button.trailing + 20
Button.leading = Safe Area.leading + 20
Safe Area.bottom = Button.bottom + 20
height = 40
    

查看图片以获得更好的理解。

要求:

如果 #condition 1 得到满足,则将按钮宽度更改为 100 或任何宽度尺寸。

其他

如果 #condition 2 得到满足,则保持宽度不变(根据给定的约束)

为了解决这个问题,

  1. 创建该按钮的前导和尾随约束的 IBOutlet。
  2. 将其设置为非活动状态。
  3. 以编程方式为按钮添加宽度锚。

将其设置为非活动是强制性的,因为两者不会同时工作,所以要小心。

@IBOutlet weak var btnNextTrailingConstraint: NSLayoutConstraint!
@IBOutlet weak var btnNextLeadingConstraint: NSLayoutConstraint!

if (condition1) {
  btnNextLeadingConstraint.isActive = false
  btnNextTrailingConstraint.isActive = false
  btnNext.widthAnchor.constraint(equalToConstant: 100).isActive = true
 }
 else {
   btnNextLeadingConstraint.isActive = true
   btnNextTrailingConstraint.isActive = true
 }


  

【讨论】:

    【解决方案3】:

    我建议使用自动布局:

    class MyButton: UIButton {
        override func awakeFromNib() {
            super.awakeFromNib()
    
            layer.shadowRadius = 5.0
    
            // autolayout solution
            self.translatesAutoresizingMaskIntoConstraints = false
            self.widthAnchor.constraint(equalToConstant: 200).isActive = true
            self.heightAnchor.constraint(equalToConstant: 35).isActive = true
        }
    } 
    

    【讨论】:

    • self.heightAnchor.constraint(equalToConstant: 35).isActive = trueself.frame.size.height=35有什么区别?
    • 好吧,这可能只是一个口味问题,但我更喜欢使用自动布局约束而不是直接设置框架。根据 [post][1] 可以将自动布局与直接框架设置结合起来,但是,我认为它会增加代码的复杂性(顺便说一句,如果您使用 nib 来设置按钮的样式,我会在笔尖也是如此,而不是以编程方式)[1]:stackoverflow.com/questions/13186908/…
    • 漂亮的东西:)
    【解决方案4】:

    你需要重写override init(frame: CGRect)方法

    class MyButton: UIButton {
    
        override init(frame: CGRect) {
            super.init(frame: frame)
            // Set your code here
    
            let width = 300
            let height = 50
            self.frame.size = CGSize(width: width, height: height)
    
            backgroundColor = .red
            layer.shadowRadius = 5.0
        }
    
        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }    
    }
    

    【讨论】:

      猜你喜欢
      • 2016-09-21
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      • 2016-10-27
      • 1970-01-01
      • 1970-01-01
      • 2016-06-30
      • 2011-04-01
      相关资源
      最近更新 更多