Swift: 在初始化期间以编程方式添加按钮而不提供框架
Swift: adding a button programmatically without supplying a frame during initialization
假设我想以编程方式添加一个 UIBUtton
。每个 UIView
构造函数都需要一个 CGFrame
,但在我的例子中,我希望大小是固有的,并且位置要锚定到超级视图的中心。
- 如果我在不提供框架的情况下实例化
UIBUtton
元素,我会在调试视图层次结构中看到它,但不会在屏幕上看到它。
- 如果我提供框架,我基本上会猜测尺寸和
x,y
值会限制我稍后添加的约束。
以编程方式添加按钮的正确方法是什么?
谢谢!
编辑:没有 CGFrame
实例化没有问题。我没有看到按钮,因为我没有添加
button.translatesAutoresizingMaskIntoConstraints = false
这是由界面生成器自动完成的。
如果您使用自动布局,请将 translateAutoResizingMaskIntoConstraints
设置为 false
并忽略框架,但不要忘记手动添加约束。
这是一个简单的例子:
override func viewDidLoad() {
super.viewDidLoad()
// no auto layout
let v = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
v.backgroundColor = UIColor.blue
view.addSubview(v)
// with auto layout
let v2 = UIView()
v2.backgroundColor = UIColor.red
// use auto layout
v2.translatesAutoresizingMaskIntoConstraints = false
// add width / height constraints
v2.addConstraint(NSLayoutConstraint(item: v2, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 100))
v2.addConstraint(NSLayoutConstraint(item: v2, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 100))
// must add to hirarchy before adding the following constraints
view.addSubview(v2)
view.addConstraint(NSLayoutConstraint(item: v2, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .leading, multiplier: 1, constant: 100))
view.addConstraint(NSLayoutConstraint(item: v2, attribute: .top, relatedBy: .equal, toItem: view, attribute: .top, multiplier: 1, constant: 0))
// auto layout, visual format
let v3 = UIView()
v3.translatesAutoresizingMaskIntoConstraints = false
v3.backgroundColor = UIColor.green
let views = [ "v3" : v3 ]
// must add v3 as subview before adding constraints referencing the parent view
view.addSubview(v3)
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-200-[v3(100)]", options: [], metrics: nil, views: views))
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-0-[v3(100)]", options: [], metrics: nil, views: views))
}
对于许多视图,不需要指定大小,因为一些视图提供了他们想要的大小intrinsicContentSize
。
您可以将其用于按钮,使它们采用它们 'need' 的大小,或使用约束强制使用另一个大小。
对于自定义视图 - 您可以覆盖此 属性 以提供您自己的 'needed size' 逻辑。
假设我想以编程方式添加一个 UIBUtton
。每个 UIView
构造函数都需要一个 CGFrame
,但在我的例子中,我希望大小是固有的,并且位置要锚定到超级视图的中心。
- 如果我在不提供框架的情况下实例化
UIBUtton
元素,我会在调试视图层次结构中看到它,但不会在屏幕上看到它。 - 如果我提供框架,我基本上会猜测尺寸和
x,y
值会限制我稍后添加的约束。
以编程方式添加按钮的正确方法是什么?
谢谢!
编辑:没有 CGFrame
实例化没有问题。我没有看到按钮,因为我没有添加
button.translatesAutoresizingMaskIntoConstraints = false
这是由界面生成器自动完成的。
如果您使用自动布局,请将 translateAutoResizingMaskIntoConstraints
设置为 false
并忽略框架,但不要忘记手动添加约束。
这是一个简单的例子:
override func viewDidLoad() {
super.viewDidLoad()
// no auto layout
let v = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
v.backgroundColor = UIColor.blue
view.addSubview(v)
// with auto layout
let v2 = UIView()
v2.backgroundColor = UIColor.red
// use auto layout
v2.translatesAutoresizingMaskIntoConstraints = false
// add width / height constraints
v2.addConstraint(NSLayoutConstraint(item: v2, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 100))
v2.addConstraint(NSLayoutConstraint(item: v2, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 100))
// must add to hirarchy before adding the following constraints
view.addSubview(v2)
view.addConstraint(NSLayoutConstraint(item: v2, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .leading, multiplier: 1, constant: 100))
view.addConstraint(NSLayoutConstraint(item: v2, attribute: .top, relatedBy: .equal, toItem: view, attribute: .top, multiplier: 1, constant: 0))
// auto layout, visual format
let v3 = UIView()
v3.translatesAutoresizingMaskIntoConstraints = false
v3.backgroundColor = UIColor.green
let views = [ "v3" : v3 ]
// must add v3 as subview before adding constraints referencing the parent view
view.addSubview(v3)
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-200-[v3(100)]", options: [], metrics: nil, views: views))
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-0-[v3(100)]", options: [], metrics: nil, views: views))
}
对于许多视图,不需要指定大小,因为一些视图提供了他们想要的大小intrinsicContentSize
。
您可以将其用于按钮,使它们采用它们 'need' 的大小,或使用约束强制使用另一个大小。
对于自定义视图 - 您可以覆盖此 属性 以提供您自己的 'needed size' 逻辑。