1

У меня есть вид, как показано ниже, который имеет автомаршрут, установленный в xib. enter image description hereДобавление Autolayout программно к существующему автозапуску Просмотры, добавленных в xibs

Теперь мне нужно добавить уведомление об ошибке, которое будет анимировать сверху, а существующие виды будут перемещаться вниз, как показано на рисунке ниже.

enter image description here

Я знаю, что могу сделать это легко, просто добавив этот вид ошибки в моем существующем контроллере представления и управления его высота ограничений. Но у меня есть пара других представлений, где мне нужно повторно использовать это представление ошибок. Итак, теперь я создал настраиваемый вид для этого представления ошибки. Теперь моя основная проблема заключается в том, чтобы добавить это к моему mainview программно с автозапуском. Поэтому мне нужно добавить синий обзор ошибок в мой 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, как это от моего ViewController

myErrorView = [[ErrorView alloc]initWithdelegate:self ForView:self.view]; 
+0

Как именно это «не работает»? – Kreiri

+0

На данный момент это дает мне ошибку, Невозможно одновременно удовлетворить ограничения. – Gamerlegend

+0

какие ограничения? – Kreiri

ответ

1

вы можете использовать идентификатор propertiy ограничений

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

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

Не могли бы вы просто добавить вид ошибки как вид сверху с высотой 0, а затем измените константу ограничения высоты, когда вы хотите ее отобразить? Вы можете анимировать это, и он будет имитировать его, отталкивая все, однако при таком подходе он не будет выглядеть так, как будто он спускается с верхней части экрана.

Если вы довольны этим подходом, вы можете просто добавить контейнерный вид к своему представлению с помощью кнопок и табличного представления, после того как вы инициализируете представление ошибки из xib, просто назначьте его контейнеру, это избавит вас от необходимости передать родительское представление, добавив его в качестве подзаголовка и добавив ограничения программно в свой класс просмотра ошибок.

Сообщите мне, если потребуется более подробная информация или конкретный пример. Надеюсь это поможет. Удачи. Кроме того, как и в стороне, вы можете посмотреть в Masonry, это значительно упрощает добавление ограничений.