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

时间:2016-09-12 06:21:51

标签: objective-c ios8 nslayoutconstraint ios-autolayout xcode7.3

我有一个像下面的视图,它在xibs中设置了自动布局。 enter image description here

现在我需要添加一个错误通知,该通知将从顶部生成,现有视图将向下移动,如下图所示。

enter image description here

我知道只需在现有视图控制器中添加此错误视图并管理其高度限制,我就可以轻松完成此操作。但我还有其他几个视图需要重新使用此错误视图。所以,现在我已经为这个错误视图创建了一个自定义视图。现在我的主要问题是使用autolayout以编程方式将其添加到我的主视图中。所以我需要在我的self.view中添加蓝色错误视图并删除绿色视图的顶部布局约束,并将其顶部设置为蓝色错误视图。合理?下面是我的错误视图代码并将其添加到self.view。但即使这样也行不通,我在这里做错了什么。任何帮助表示赞赏。

List<String> list = Arrays.asList("def123", "abc999", "zzz000", "abc123", "zzz111");

Comparator<String> cmp = new Comparator<String>() {
  public int compare(String o1, String o2) {
    int diff = (o1.substring(0,3)).compareTo(o2.substring(0,3));
        return (diff == 0) ? (Integer.valueOf(o2.substring(3)).compareTo(Integer.valueOf(o1.substring(3)))): diff;
  }
};
Collections.sort(list, cmp);

我从我的viewcontroller

中调用了这样的errorView
-(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]];

}

2 个答案:

答案 0 :(得分:1)

您可以使用约束的标识符属性

NSArray *ArrayConstraint  = yorlableorView.constraints;
 for (NSLayoutConstraint *ob in ArrayConstraint)
      {

                    if ([ob.identifier isEqualToString:@"yourIdentifier"]) 
                   {
                        ob.constant = 0 ;
                // set your constant you want
                    }
            }

答案 1 :(得分:1)

您是否可以将错误视图添加为高度为0的顶视图,然后在要显示时更改高度约束常量?你可以对它进行动画处理,它会模拟它向下推动一切,但是通过这种方法,它看起来不会从屏幕顶部下来。

如果您对此方法感到满意,可以使用按钮和tableview为视图添加容器视图,然后在从xib初始化错误视图后将其分配给容器,这样可以节省您的时间必须传递父视图,将其添加为子视图并在错误视图类中以编程方式添加约束。

如果需要更多详细信息或具体示例,请告诉我。希望这有帮助,祝你好运。另外,您可以查看Masonry,它可以更容易地以编程方式添加约束。