AutoLayout 调整自定义 UIView 内容
AutoLayout resize custom UIView content
我有一个通过 IB 添加的标准 UIView,它使用约束根据方向更改大小。我以编程方式向该视图添加了一个自定义组件(UIView 的子类),默认情况下,它的大小与其父视图相同。问题是,如何让我的自定义视图(以编程方式添加)更新其大小以在父级大小更改(由于方向更改)时匹配其父级?
@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)
}
您可以使用大小 Class 功能。设置约束并添加视图基础或方向更改。
检查本教程
http://www.hossamghareeb.com/size-classes-tutorial/
设置以编程方式添加的视图的 top,bottom,leading and trailing
约束,每个约束具有常量 0
。因此,相对于您在 IB
中添加的父视图,它将始终保持相同的大小。如果你想要理性的(比如父视图的一半高度和宽度或其他任何东西)height
或 width
那么你可以通过玩 constant
和 multiplier
.
如果您不知道如何以编程方式添加约束,那么您可以参考 This SO post。
viewDidLayoutSubviews
来解决我们的问题,
描述:
When the bounds change for a view controller's view, the view adjusts the positions of its subviews and then the system calls this method.
代替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)
}
试试这个
@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
}
我有一个通过 IB 添加的标准 UIView,它使用约束根据方向更改大小。我以编程方式向该视图添加了一个自定义组件(UIView 的子类),默认情况下,它的大小与其父视图相同。问题是,如何让我的自定义视图(以编程方式添加)更新其大小以在父级大小更改(由于方向更改)时匹配其父级?
@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)
}
您可以使用大小 Class 功能。设置约束并添加视图基础或方向更改。 检查本教程 http://www.hossamghareeb.com/size-classes-tutorial/
设置以编程方式添加的视图的 top,bottom,leading and trailing
约束,每个约束具有常量 0
。因此,相对于您在 IB
中添加的父视图,它将始终保持相同的大小。如果你想要理性的(比如父视图的一半高度和宽度或其他任何东西)height
或 width
那么你可以通过玩 constant
和 multiplier
.
如果您不知道如何以编程方式添加约束,那么您可以参考 This SO post。
viewDidLayoutSubviews
来解决我们的问题,
描述:
When the bounds change for a view controller's view, the view adjusts the positions of its subviews and then the system calls this method.
代替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) }
试试这个
@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
}