以编程方式将自动布局添加到肋骨中添加的现有自动布局视图

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> 【参考方案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,它可以更轻松地以编程方式添加约束。

【讨论】:

以上是关于以编程方式将自动布局添加到肋骨中添加的现有自动布局视图的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式使用自动布局将子视图添加到 UICollectionView 不起作用

以编程方式将自动布局约束添加到恒定宽度和高度的子视图

在情节提要中添加自动布局,然后以编程方式更新它

以编程方式向导航控制器添加自动布局约束

如何以编程方式使用自动布局添加自定义视图

以编程方式自动布局不起作用