使用自动布局使 CustomView 适合 SuperView

Fit CustomView into SuperView with Autolayout

我正在尝试创建一个基于此 tutorial 翻转的卡片视图。它创建一个 UIView 并添加卡片视图。

为此,我创建了一个自定义 UIView(使用 Xib),到目前为止它运行良好。我在故事板中为调用 addSubview 的视图添加了正确的约束。到目前为止这是有效的,但是当我添加自定义 UIView 时,它指的是它在 xib 中的大小而不是超级视图的大小。

如何添加必要的自动布局约束以使子视图适合其父视图?

谢谢!

P.S。我已经在 Objective-C 中写了它,但如果答案在 swift 或 Objective-C.

中,这对我来说并不重要

如果你想在代码中做到这一点。似乎对我来说效果更好,也更有意义。

// make sure myCustomView is added to the superview
// and ignore the layout guides if the superview is not your view controller
[myCustomView setTranslatesAutoresizingMaskIntoConstraints: NO];

id topGuide = self.topLayoutGuide;
id bottomGuide = self.bottomLayoutGuide;

NSDictionary * viewsDictionary = NSDictionaryOfVariableBindings(myCustomView, topGuide, bottomGuide);

[mySuperiew addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[myCustomView]|" options:0 metrics: 0 views:viewsDictionary]];

[mySuperiew addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[topGuide][myCustomView][bottomGuide]|" options:0 metrics: 0 views:viewsDictionary]];

不确定,有什么问题。我通过以下方式做了同样的事情:

1) ProductItemView,UIView 的子 class 并创建了 ProductItemView.xib,它有一个 UIView 对象。

2) 在 .xib 中将文件的所有者 class 设置为 ProductItemView,以便可以加载 .xib 的 UIView 对象和其他子视图并与 IBOutlet 链接。(见图)

3) 在初始化方法中(initWithFrame:在我的例子中)方法放在代码下面

    NSArray *nibViewArray = [[NSBundle mainBundle] loadNibNamed:@"ProductItemView" owner:self options:nil];

    if (nibViewArray.count) {
        UIView *nibView = [nibViewArray objectAtIndex:0];
        [self addSubview:nibView];

        nibView.translatesAutoresizingMaskIntoConstraints = NO;

        NSDictionary *viewDict = NSDictionaryOfVariableBindings(nibView);
        [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[nibView]-0-|" options:0 metrics:nil views:viewDict]];

        [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[nibView]-0-|" options:0  metrics:nil views:viewDict]];

    }

最后创建 ProdutItemView 的对象并使用框架或设置约束并将其添加到超级视图。如果您正在设置约束,那么不要忘记将 translatesAutoresizingMaskIntoConstraints 属性 设置为 NO。 希望对你有所帮助。