简体   繁体   English

AutoLayout调整自定义UIView内容的大小

[英]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 . 如果您想要有理智的(例如父视图的一半高度和宽度或其他任何东西) heightwidth则可以通过使用constantmultiplier

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM