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

时间:2016-08-23 05:31:35

标签: ios iphone swift uiview ios-autolayout

我有一个标准的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)
}

4 个答案:

答案 0 :(得分:1)

以编程方式添加视图的top,bottom,leading and trailing约束,并使用每个约束0。因此,对于您在IB中添加的父视图,它始终保持相同的大小。如果您想要理性(例如父视图或其他任何内容的半高和宽度)heightwidth,那么您可以通过使用constantmultiplier进行管理。

如果您不知道如何以编程方式添加约束,那么您可以参考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/