2015-03-11 4 views
0

Я использую визуальный формат для определения ограничений. Цель состоит в том, чтобы разместить UIView в нижней части супер-представления, скажем self.view с высотой, установленной как 40, и шириной автоматически. Я сделал это с помощью Storyboard, но я не могу сделать это программно. Вот код, который я написал. Приложение терпит крах, если я не даю фиксированной ширины. Он сбой со следующим ограничением: «H: [redView] |». Если я изменил это на «H: [redView (100)]», он работает. Я не хочу использовать self.bounds и получить ширину оттуда. Он должен придерживаться левой стороны супер-представления, нижней и правой стороны.Приложение сбой при добавлении ограничений программно

Пожалуйста, помогите!

NSDictionary *viewsDictionary = @{@"redView":self.redView}; 


NSArray *constraint_H = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[redView(40)]" 
                   options:0 
                   metrics:nil 
                    views:viewsDictionary]; 

NSArray *constraint_V = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[redView]|" 
                   options:0 
                   metrics:nil 
                    views:viewsDictionary]; 

// 3. Define the redView Position 
NSArray *constraint_POS_V = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[redView]|" 
                    options:0 
                    metrics:nil 
                     views:viewsDictionary]; 

NSArray *constraint_POS_H = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[redView]" 
                    options:0 
                    metrics:nil 
                     views:viewsDictionary]; 
[self.redView addConstraints:constraint_H]; 
[self.redView addConstraints:constraint_V]; 



[self.view addConstraints:constraint_POS_H]; 
[self.view addConstraints:constraint_POS_V]; 
+0

Сообщение об исключении должно быть довольно четким. –

ответ

0

Изменение этой линии

[self.redView addConstraints:constraint_V]; 

с

[self.view addConstraints:constraint_V]; 

решаемые себя. Благодаря мне .. :)

0

Если вы хотите взять ширину зрения и применить его к красному зрения, вам нужно только добавить ограничение так:

NSArray *constraint_POS_H = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[redView]-|" 
                   options:0 
                   metrics:nil 
                    views:viewsDictionary]; 
1

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

Вертикальное ограничение работает так, как оно есть, потому что оно не ссылается на родительский вид.

Вы можете изменить свой код немного, так что ограничения более ясно:

NSArray *verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[redView(40)]|" options:0 metrics:nil 
                     views:viewsDictionary]; 

NSArray *horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[redView]|" options:0 metrics:nil 
                     views:viewsDictionary]; 

[self.view addConstraints:horizontalConstraints]; 
[self.view addConstraints:verticalConstraints]; 

Просто помните, что вы всегда должны добавить ограничения для UIView на это superview.

1

Прежде всего, вы должны добавить redView. Кроме того, ограничения должны быть добавлены в супервизор, а не redView.

[self.view addSubview:self.redView]; 

// create your constraints here 

[self.view addConstraints:@[constraint_H, constraint_V, constraint_POS_V, constraint_POS_H]]; 
[self.view updateConstraintsIfNeeded];