我有一个标准的UIView通过IB添加,它使用约束根据方向改变大小。以编程方式,我将自定义组件(子类UIView)添加到此视图,默认情况下,该视图的大小为sam大小作为其父视图。问题是,当父项大小发生变化时(由于方向改变),我如何获得我的自定义视图(以编程方式添加)来更新其大小以匹配其父级?
@IBOutlet weak var cardView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
let frame = cardView.bounds
// Custom component sub classes UI View
// Should always be same size as its parent
let imageTemplateView: ImageTemplateView = ImageTemplateView(frame: frame)
cardView.addSubview(imageTemplateView)
}
答案 0 :(得分:1)
以编程方式添加视图的top,bottom,leading and trailing
约束,并使用每个约束0
。因此,对于您在IB
中添加的父视图,它始终保持相同的大小。如果您想要理性(例如父视图或其他任何内容的半高和宽度)height
或width
,那么您可以通过使用constant
和multiplier
进行管理。
如果您不知道如何以编程方式添加约束,那么您可以参考This SO post。
答案 1 :(得分:1)
viewDidLayoutSubviews
来解决我们的问题,
说明:
当视图控制器视图的边界发生变化时,视图会调整其子视图的位置,然后系统会调用此方法。
而不是viewDidLoad
使用viewDidLayoutSubviews
如下
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
let imageTemplateView: ImageTemplateView = ImageTemplateView(frame: frame)
cardView.addSubview(imageTemplateView)
imageTemplateView.clipsToBounds = true
}
<强>更新强>
在viewdidload
var imageTemplateView: ImageTemplateView = ImageTemplateView()
设置框架并将其添加为viewdidload
中的子视图override func viewDidLoad() {
imageTemplateView = ImageTemplateView(frame: frame)
cardView.addSubview(imageTemplateView)
imageTemplateView.clipsToBounds = true
}
在viewDidLayoutSubviews
中只需单独设置框架,以便每当方向更改时ImageTemplateView
的框架都会更新
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
imageTemplateView = ImageTemplateView(frame: frame)
}
答案 2 :(得分:1)
试试这个
@IBOutlet weak var cardView: UIView!
var imageTemplateView:ImageTemplateView!
override func viewDidLoad()
{
super.viewDidLoad()
imageTemplateView = ImageTemplateView(frame: cardView.bounds)
cardView.addSubview(imageTemplateView)
}
override func viewDidLayoutSubviews()
{
super.viewDidLayoutSubviews()
imageTemplateView.frame = cardView.bounds
}
答案 3 :(得分:0)
您可以使用尺寸等级功能。设置约束并添加视图基础或方向更改。 查看本教程 http://www.hossamghareeb.com/size-classes-tutorial/