如何在 nib 中为 UIView 应用自动布局?

How to apply autolayout for UIView in nib?

我对 xib/nib 上的自动布局感到困惑。我对故事板自动布局很满意。

我想做的是:

1. 我有一个故事板,其中有一个视图控制器和一个名为 borderView 的 UIView。它受到约束 correctly.It 已针对 iphone 5 和 6 正确调整大小。这是故事板的屏幕截图:

这是 iphone 5 中的 borderView:(我正在尝试将 nib 视图作为子视图添加到此边框视图中)

2. 我创建了一个带有 UIView 的笔尖,尺寸为 300 x 300。我希望将此视图添加到我的 ViewController 中的 borderVIew。这是我笔尖的截图。

注意:我没有在任何地方给出任何高度或宽度限制。我只是给出了 leading,traliing,top 和 bottom。

我正在尝试将笔尖添加到我的边框视图中,如下所示:

这是我的方法 viewController:

   -(void)viewDidAppear:(BOOL)animated{

    [super viewDidAppear:animated];

    [[NSBundle mainBundle] loadNibNamed:@"AlertView" owner:self options:nil];

    [self.borderView addSubview:self.myAlertViewFromNib];

}

iphone 5 中的结果是:

如您所见,nib 视图未在屏幕中心对齐(因为边框视图与屏幕中心对齐)。

我不知道如何对 nib 本身进行约束。谁能告诉我是否可以在 xcode 中做到这一点,或者我是否需要以编程方式给出约束?

不使用 xib 和故事板,而是使用故事板并在 borderview 内添加另一个视图(包含 xib 中的所有内容)并将该视图限制在 borderview 内。 使用垂直居中和水平居中约束使内部视图居中。如果以后需要更改约束,请在头文件中为它们创建一个出口并调整优先级。 如果您仍想在视图中使用 xib,请尝试使用像 Masonry 这样的第三方库来调整您的 xib。

如果您别无选择,只能这样做,请尝试手动设置中心。即 yourView.frame.x = super.frame.size.width/2 - yourView.frame.size.width/2。这应该水平居中。如果它不允许你,那么你必须在添加到子视图后添加约束。

您想将 AlertView 添加为在视图控制器中对齐的中心 与其从 xib 设置大小,不如创建完美的受限 XIB 视图并为大小定义宏,如下所示。

第 1 步有一些尺寸宏

#define kAlertViewWidth 300
#define kAlertViewHeight 300

@interface 中的第 2 步。请在 属性 上像这样在 viewcontroller

中创建
@property (nonatomic, retain) IBOutlet UIView *myViewFromNib;

Getter 属性

方法
-(UIView *)myViewFromNib
{
if (!_myViewFromNib) {
    _myViewFromNib = [[[NSBundle mainBundle] loadNibNamed:@"AlertView" owner:self options:nil] objectAtIndex:0];
    _myViewFromNib.translatesAutoresizingMaskIntoConstraints = NO;


}
return _myViewFromNib;
}

//viewDidLoad方法中的第3步

 -(void)viewDidLoad{
  [self setUpConstraints];
}

将添加所需约束的方法

    -(void)setUpConstraints
    {
        \[self.view addSubview:self.myViewFromNib\];
        \[NSLayoutConstraint activateConstraints:@\[\[NSLayoutConstraint constraintWithItem:self.myViewFromNib attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0\],

                                                  \[NSLayoutConstraint constraintWithItem:self.myViewFromNib attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0\],

                                                  \[NSLayoutConstraint constraintWithItem:self.myViewFromNib attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0
                                                                                constant:kAlertViewWidth\],

                                                  \[NSLayoutConstraint constraintWithItem:self.myViewFromNib attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0
                                                                                constant:kAlertViewHeight\]\]\];
    }