2015-08-23 2 views
0

Я изучаю UIAutolayout. В этом я узнал, как добавлять представления в супервизор, а затем предоставлять ограничения. Я планирую иметь два представления на экране, дать им красные и синие цвета. Поскольку constraitns влияют как на супервизор, так и на subview (как показано в строке формата), я добавил ограничения для супервизора. (Это неправильно ???) Я набрал следующий код в моей функции viewDidLoad.Виды не расширяются, чтобы соответствовать ограничениям

[super viewDidLoad]; 
// Do any additional setup after loading the view, typically from a nib. 


UIView * view1 = [[UIView alloc] init]; 
[view1 setBackgroundColor:[UIColor redColor] ] ; 


UIView *view2 = [[UIView alloc] init]; 
[view2 setBackgroundColor: [UIColor blueColor]] ; 


//Adding the view to the main view. 
[self.view addSubview:view1] ; 

[self.view addSubview:view2] ; 


[view1 setTranslatesAutoresizingMaskIntoConstraints:NO]; 
[view2 setTranslatesAutoresizingMaskIntoConstraints:NO]; 

//Making the namemap for sending to the function 
NSDictionary *nameMap = @{@"view1":view1,@"view2":view2} ; 


//Creating the constraint below 

NSArray * horizontalContraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-30-[view2]-60-[view1]-30-|" options:0 metrics:nil views:nameMap] ; 

NSArray *view1Height = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-30-[view1]-30-|" options:0 metrics:nil views:nameMap] ; 

NSArray *view2Height = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-30-[view2]-30-|" options:0 metrics:nil views:nameMap] ; 


//Adding the constraints 
[self.view addConstraints:horizontalContraints] ; 

[self.view addConstraints:view2Height] ; 

[self.view addConstraints:view1Height] ; 

ПРОБЛЕМА: Я получаю только синий вид в качестве выходного сигнала на экране. Я не получаю красный. Я тестировал это как на iPad, так и на iPhone, но результаты одинаковы. Больше кода нет. Я использую Xcode 5 и iOS 7 (ну, потому что я учусь). Благодарю.

ответ

1

Проблема с вашими «horizontalContraints». Как сказал Пареш, вам нужно указать ширину просмотров.

Таким образом, изменив "horizontalContraints" в

NSArray *horizontalContraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-30-[view2]-60-[view1(==view2)]-30-|" options:0 metrics:nil views:dict]; 

даст вам желаемый результат.

Все после изменения выглядит следующим образом.

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    UIView * view1 = [[UIView alloc] init]; 
    [view1 setBackgroundColor:[UIColor redColor]]; 

    UIView *view2 = [[UIView alloc] init]; 
    [view2 setBackgroundColor:[UIColor blueColor]]; 

    [view1 setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    [view2 setTranslatesAutoresizingMaskIntoConstraints:NO]; 

    //Adding the view to the main view. 
    [self.view addSubview:view1]; 
    [self.view addSubview:view2]; 

    NSDictionary *dict =[[NSDictionary alloc] init]; 
    dict = @{@"view1":view1, @"view2":view2}; 

    NSArray *horizontalContraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-30-[view2]-60-[view1(==view2)]-30-|" options:0 metrics:nil views:dict]; 

    NSArray *view1Height = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-30-[view1]-30-|" options:0 metrics:nil views:dict]; 

    NSArray *view2Height = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-30-[view2]-30-|" options:0 metrics:nil views:dict]; 

    [self.view addConstraints:horizontalContraints]; 
    [self.view addConstraints:view2Height]; 
    [self.view addConstraints:view1Height]; 
} 

Надеюсь, это вам поможет. :)

0

Ну, как ты грустишь ты учишься, поэтому я даю вам, что учебник: AutoLayout Objective-C

Если это не ответ на ваш вопрос, не стесняйтесь спросить меня: D

+0

Спасибо за помощь. Я уже использую для этого знаменитую книгу «Big Nerd Ranch Guide-iOS programming». Согласно книге, я делаю это правильно, но все же не получаю требуемых результатов. :( – LearneriOS

1

EDIT:

Мои предыдущий ответ предполагал, что для view1 и view2 не существует горизонтальных ограничений, чтобы их разделить (но, оказывается, они были на месте).

Реальная проблема здесь состоит в том, что при добавлении horizontalConstraints, это то, что вы говорите autolayout сделать:

Start слева оставить пространство 30, добавить view2, затем оставить пространство 60, после того, как которые добавляют view1 и, наконец, оставляют пространство 30 с правого края.

Но здесь нет ничего, что говорит об автоопределении, насколько широким должно быть пространство для просмотра (view1 и view2). Даже когда вы создали свои представления, вы не установили для него никакого кадра (что означает отсутствие высоты или ширины).

Теперь, когда ваши взгляды изложены в соответствии с этими ограничениями, autolayout только дает общую доступную ширину на первый взгляд в вашем horizontalConstraints, который view2 в вашем случае (потому что никто не сказал autolayout держать любую ширину для view1 , он рад установить его на ноль). Следовательно, вы никогда не увидите свой view1.

Есть несколько вещей, которые вы можете сделать, чтобы исправить это:

  • Либо установить фиксированную ширину для обоих взглядов
  • Установка фиксированной ширины для одного из представлений, а затем оставшаяся ширина будет уделяться второй вид автоопределения.
  • Если вы хотите, чтобы оба вида были одинаково широкими, добавьте для них ограничение равной ширины. Затем автоотключение разделит доступную ширину равным образом между view1 и view2.

ОРИГИНАЛЬНЫЙ ОТВЕТ:

Проблема очень проста. Вы добавляете 2 набора ограничений, view1Height и view2Height к вашему self.view.

Если вы посмотрите на них внимательно, это то, что вы говорите autolayout сделать:

Для view1: Start сверху в self.view оставить пространство 30, а затем добавить view1 и снова оставить пространство 30.

Аналогично для View2: Начните с верхней в self.view оставить пространство 30, а затем добавить view2 и снова оставить пространство 30.

Таким образом, в силу вы размещаете как взгляды на то же самое место. Следовательно, теперь только z-координата определит, какой вид будет виден. Поскольку вы добавили view2 (синий) после добавления view1, следовательно, его перекрывающийся view1. Это приводит к тому, что ... вы догадались, что это правильно, просто view2 будет видимым.

+0

Вы правы, но я также добавил горизонтальные ограничения к представлениям, которые будут определять положение представлений в горизонтальном направлении (по оси x). Я попросил левый край зрения2 на расстоянии 30 точек от контейнера, его правый край должен быть в 60 точках от view1, view1 - правый край, чтобы быть на расстоянии 30 точек от правого края контейнера. И затем я добавил это ограничение в superview ie self.view. Этот оператор. NSArray * horizontalContraints = [ Ограничения NSLayoutConstraintWithVisualFormat: @ "H: | -30- [view2] -60- [view1] -30- |" options: 0 metrics: nil views: nameMap]; – LearneriOS

+0

Извините, что я плохой, я не заметил горизонтальных ограничений, которые вы но я нашел проблему. Я обновляю свой ответ. – paresh