[英]AutoLayout resize custom UIView content
I have a standard UIView added via IB which changes size based on orientation using constraints. 我有一个通过IB添加的标准UIView,它使用约束根据方向更改大小。 Programatically I add a custom component (sub-classing UIView) to this view which by default is the sam size as its parent view. 我以编程方式向此视图添加了一个自定义组件(子类化UIView),默认情况下它是sam大小作为其父视图。 Problem is, how do I get my custom view (programatically added) to update its size based to match its parent when the parents size changes (due to orientation change)? 问题是,当父级尺寸更改(由于方向更改)时,如何获取自定义视图(以编程方式添加)以更新其尺寸以匹配其父级?
@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)
}
Set your programmatically added view's top,bottom,leading and trailing
constraints with constant 0
of each. 将以编程方式添加的视图的top,bottom,leading and trailing
约束设置为常数0
。 So, it will always keep same size with respect to parent view that you have added in IB
. 因此,相对于您在IB
添加的父视图,它将始终保持相同大小。 If you want rational(like half height and width of parent view or anything else) height
or width
then you can manage it by playing with constant
and multiplier
. 如果您想要有理智的(例如父视图的一半高度和宽度或其他任何东西) height
或width
则可以通过使用constant
和multiplier
。
If you don't have idea that how to add constraints programmatically then you can refer This SO post . 如果您不知道如何以编程方式添加约束,则可以参阅This SO post 。
Here comes viewDidLayoutSubviews
to resolve our issue, 这是viewDidLayoutSubviews
来解决我们的问题,
Description: 描述:
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. 当视图控制器的视图的边界发生变化时,视图将调整其子视图的位置,然后系统调用此方法。
Instead of viewDidLoad
use viewDidLayoutSubviews
as follows 代替viewDidLoad
使用viewDidLayoutSubviews
如下
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
let imageTemplateView: ImageTemplateView = ImageTemplateView(frame: frame)
cardView.addSubview(imageTemplateView)
imageTemplateView.clipsToBounds = true
}
UPDATE: 更新:
Declare variable above viewdidload
在viewdidload
上方声明变量
var imageTemplateView: ImageTemplateView = ImageTemplateView()
set frame and add it as sub view in viewdidload 设置框架并将其添加为viewdidload中的子视图
override func viewDidLoad() { imageTemplateView = ImageTemplateView(frame: frame) cardView.addSubview(imageTemplateView) imageTemplateView.clipsToBounds = true }
In viewDidLayoutSubviews
just set the frame alone,so that whenever orientation changes ImageTemplateView
's frame will be updated 在viewDidLayoutSubviews
仅设置框架,以便每当方向改变时ImageTemplateView
的框架都会更新
override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() imageTemplateView = ImageTemplateView(frame: frame) }
try this 尝试这个
@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
}
You can use Size Class feature. 您可以使用尺寸分类功能。 Set constraint and add view base or orientation change. 设置约束并添加视图基础或方向更改。 Check this Tutorial http://www.hossamghareeb.com/size-classes-tutorial/ 检查此教程http://www.hossamghareeb.com/size-classes-tutorial/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.