如何在 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\]\]\];
}
我对 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\]\]\];
}