使用自动布局使 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。
希望对你有所帮助。
我正在尝试创建一个基于此 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。 希望对你有所帮助。