以编程方式将自动布局添加到肋骨中添加的现有自动布局视图
Posted
技术标签:
【中文标题】以编程方式将自动布局添加到肋骨中添加的现有自动布局视图【英文标题】:Adding Autolayout programatically to existing autolayout Views added in xibs 【发布时间】:2016-09-12 06:21:51 【问题描述】:我有一个像下面这样的视图,它在 xibs 中设置了自动布局。
现在我需要添加一个错误通知,它将从顶部开始动画,现有视图将向下移动,如下图所示。
我知道我可以很容易地做到这一点,只需在我现有的视图控制器中添加这个错误视图并管理它的高度约束。但是我还有其他几个视图需要重新使用这个错误视图。所以,现在我为这个错误视图创建了一个自定义视图。现在我的主要问题是使用自动布局以编程方式将其添加到我的主视图中。所以我需要在我的 self.view 中添加蓝色错误视图并删除绿色视图的顶部布局约束并将其顶部设置为蓝色错误视图。有道理?下面是我的错误视图代码并将其添加到 self.view。但即使这样也行不通,我在这里做错什么了吗?任何帮助表示赞赏。
-(id)initWithdelegate:(id)parentSelf ForView:(UIView *)parentView
if (self = [super initWithFrame:CGRectMake(0, 0, 100, 100)])
// Initialization code
self=(ErrorView*)[[[NSBundle mainBundle] loadNibNamed:@"ErrorView" owner:nil options:nil]objectAtIndex:0];
self.delegate=parentSelf;
[parentView addSubview:self];
self.hidden = YES;
[self setConstraintsToParentView:parentView];
return self;
-(void)setConstraintsToParentView:(UIView *)parentView
[parentView setTranslatesAutoresizingMaskIntoConstraints:NO];
//Setting width equal to parentview
[parentView addConstraint:[NSLayoutConstraint constraintWithItem:self
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:parentView
attribute:NSLayoutAttributeWidth
multiplier:1
constant:0]];
//Setting fixed height of 50
[parentView addConstraint:[NSLayoutConstraint constraintWithItem:self
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationGreaterThanOrEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1.0
constant:50]];
//Setting x pos to center
[parentView addConstraint:[NSLayoutConstraint constraintWithItem:self
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:parentView
attribute:NSLayoutAttributeCenterX
multiplier:1.0
constant:0.0]];
//Setting top position to self.view with constant 20
[parentView addConstraint:[NSLayoutConstraint constraintWithItem:self
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:parentView
attribute:NSLayoutAttributeTop
multiplier:1.0
constant:20]];
我正在从我的视图控制器中这样调用 errorView
myErrorView = [[ErrorView alloc]initWithdelegate:self ForView:self.view];
【问题讨论】:
它究竟是如何“不工作”的? 目前出现错误,无法同时满足约束。 哪些约束? 它似乎在所有约束上都给出了错误。例如:将尝试通过打破约束来恢复 <0x7c131ec0 errorview:0x7bf8ea30. uiview:0x7c035430.width>0x7c131ec0> 【参考方案1】:你可以使用约束的标识符属性
NSArray *ArrayConstraint = yorlableorView.constraints;
for (NSLayoutConstraint *ob in ArrayConstraint)
if ([ob.identifier isEqualToString:@"yourIdentifier"])
ob.constant = 0 ;
// set your constant you want
【讨论】:
【参考方案2】:是否可以将错误视图添加为高度为 0 的顶视图,然后在要显示时更改高度约束常量?您可以对此进行动画处理,它会模拟将所有内容向下推,但是通过这种方法,它看起来不会像从屏幕顶部向下移动。
如果您对这种方法感到满意,您可以使用按钮和表格视图将容器视图添加到您的视图中,然后在您从 xib 初始化错误视图后,只需将其分配给容器,这样您就不必传递父视图,将其添加为子视图,并以编程方式在错误视图类中添加约束。
如果需要更多细节或具体示例,请告诉我。希望这有帮助,祝你好运。另外顺便说一句,您可以查看Masonry,它可以更轻松地以编程方式添加约束。
【讨论】:
以上是关于以编程方式将自动布局添加到肋骨中添加的现有自动布局视图的主要内容,如果未能解决你的问题,请参考以下文章