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 中添加的父视图,它将始终保持相同的大小。如果你想要理性的(比如父视图的一半高度和宽度或其他任何东西)heightwidth 那么你可以通过玩 constantmultiplier.

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