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

Posted

技术标签:

【中文标题】如何在 nib 中为 UIView 应用自动布局?【英文标题】:How to apply autolayout for UIView in nib? 【发布时间】:2015-09-19 00:59:36 【问题描述】:

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

我想做的是:

1. 我有一个带有一个视图控制器和一个 UIView 的情节提要,称为borderView。它被正确约束。它为 iphone 5 和 6 正确调整大小。这是情节提要的屏幕截图:

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

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

注意:我没有在任何地方给出任何高度或宽度限制。我只是给出了领先,traliing,顶部和底部。

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

这是我的 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 中执行此操作,或者我是否需要以编程方式给出约束?

【问题讨论】:

【参考方案1】:

您希望将 AlertView 添加为视图控制器中的中心对齐 而不是从 xib 设置大小,只需创建完美的约束 xib 视图并为大小定义宏,如下所示。

第 1 步有一些尺寸宏

#define kAlertViewWidth 300
#define kAlertViewHeight 300

@interface 中的第 2 步。请在视图控制器中创建这样的属性

@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方法中的第三步

 -(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\]\]\];
    

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于如何在 nib 中为 UIView 应用自动布局?的主要内容,如果未能解决你的问题,请参考以下文章

将子类 UIView 添加到具有自动布局约束的 Nib

如何使用自动布局在 UIScrollView 中为视图高度设置动画?

如何使用自动布局在 Swift 中为可重用的 UIView 设置约束?

加载另一个 Nib 时的 iOS 自动布局

从 NIB 加载视图以用作滚动视图中的页面会取消自动布局

Xcode Interface builder 中的 Nib 视图不应用自动布局约束