使用 Autolayout 将 CustomView 适配到 SuperView

Posted

技术标签:

【中文标题】使用 Autolayout 将 CustomView 适配到 SuperView【英文标题】:Fit CustomView into SuperView with Autolayout 【发布时间】:2015-01-17 18:55:26 【问题描述】:

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

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

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

谢谢!

附:我已经用 Objective-C 编写了它,但答案是 swift 还是 Objective-C 对我来说并不重要。

【问题讨论】:

【参考方案1】:

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

1) ProductItemView,UIView 的子类,并创建了具有 UIView 对象的 ProductItemView.xib。

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

3) 在 init 方法(在我的例子中为 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。 希望对您有所帮助。

【讨论】:

我会接受这个答案,因为它更清楚一点,我必须做什么。对于翻转动画,在将其添加到我翻转的“StoryboardView”之后,我还必须为每个 FlipView(正面和背面)添加这些约束。此外,我必须在每次翻转时删除并添加这些约束(例如,显示前:添加前约束,删除后约束)。最后,我不得不将这些约束添加到 Storyboard View 和 CustomView。【参考方案2】:

如果您想在代码中执行此操作。似乎对我来说效果更好,更有意义。

// 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]];

【讨论】:

这似乎部分起作用。我必须将它添加到我的“故事板视图”以适应自定义视图。此外,我必须将其添加到我的自定义视图中以适合其内容视图。当第一次这样做时,它工作正常,但在翻转两次(返回第一个视图)后,它会扭曲 customview.contentview 的内容。

以上是关于使用 Autolayout 将 CustomView 适配到 SuperView的主要内容,如果未能解决你的问题,请参考以下文章

使用 AutoLayout 将 UIView 隐藏在单元格内时,不适合 UITableViewCell 高度

使用 AutoLayout 将 UIView 调整为离散值

使用 Autolayout 将 UILabel 沿其父视图的底部对齐

使用 AutoLayout,当导航栏消失时,如何将 UILabel 保持在同一位置?

使用 AutoLayout 以编程方式将 UILabel 添加到 ScrollView (swift)

如何使用 AutoLayout 使两个视图居中