使用Autolayout将CustomView安装到SuperView中

时间:2015-01-17 18:55:27

标签: ios objective-c swift autolayout

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

为此,我创建了一个自定义UIView(使用Xib),到目前为止它工作正常。我在我的Storyboard中为调用addSubview的视图添加了正确的约束。到目前为止这是有效的,但是当我添加自定义UIView时,它指的是xib中的大小,而不是superview的大小。

如何添加必要的Autolayout约束以使子视图适合其超级视图?

谢谢!

P.S。我已经在Objective-C中写了它,但如果答案是快速的或Objective-C,那对我来说并不重要。

2 个答案:

答案 0 :(得分:3)

不确定,有什么不对。我按照以下方式做了同样的事情:

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

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

enter image description here

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的对象并使用框架或设置Constraints并将其添加到超级视图。如果要设置约束,则不要忘记将translatesAutoresizingMaskIntoConstraints属性设置为NO。 希望它对你有所帮助。

答案 1 :(得分:0)

如果你想在代码中这样做。似乎对我来说更好,更有意义。

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