2014-06-05 1 views
0

Я пытаюсь программно установить некоторые ограничения. У меня есть один вид контейнера UIView, который содержит три подпункта.Создание ограничения для метки центра в поле зрения

UIView - circleView
UILabel - label1
UILabel - label2

circleview показан в верхней части контейнера в точке (0,0, ширина, 80). Метка 1 показана под круговым обзором с отступом 5.0.

Теперь я пытаюсь добавить метку2 в центр круга. Как это сделать с помощью AutoLayout программно.

Это то, что я сейчас делаю.

NSDictionary *views = NSDictionaryOfVariableBindings(circleView,labelView, iconLbl); 

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[circleView(circleSize)]|" options:0 metrics:metrics views:views]]; 
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[labelView]|" options:0 metrics:metrics views:views]]; 
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[circleView(circleSize)]-(padding)-[labelView]-|" options:0 metrics:metrics views:views]]; 

Метка2 является значком iconLbl в словаре.

ответ

2

Это должно быть относительно простым - это помогает использовать XIB, чтобы узнать, сколько ограничений вы на самом деле нужно, чтобы получить эффект, который вы хотите. Ограничение метки, находящейся в центре другого представления, оба из которых находятся в parentView, требует только 2 ограничений, которые должны быть полностью ограничены. Если это был обычный UIView, вам понадобится 4 ограничения (x, y, width, height), но метка автоматически определит его ширину и высоту из содержимого, поэтому это не является двусмысленным. Это, конечно, если у вас другие взгляды все правильно ограничены, но вы только спросили о метке2 в виде круга.

Я предпочитаю использовать невизуальную форму для определения ограничений, потому что они читают как математические уравнения. Вы хотите:

label2.centerX = circleView.centerX * 1 + 0;

label2.centerY = circleView.centerY * 1 + 0;

Поскольку они являются братьями и сестрами с общим родителем, ограничения добавляются к parentView. Таким образом, вы получаете следующие два ограничения.

[parentView addConstraint:[NSLayoutConstraint constraintWithItem:label2 attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:circleView attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0]]; 

[parentView addConstraint:[NSLayoutConstraint constraintWithItem:label2 attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:circleView attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0.0]]; 

Этого достаточно для получения метки2, центрированной в parentView. Любые проблемы, которые вы получите, вероятно, будут связаны с другими ограничениями между вашими представлениями, которые не будут правильно указаны.

1

Вы можете попробовать это?

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[circleView(circleSize)]" options:0 metrics:metrics views:views]];  //Dont link to both the sides. Dock to the left edge 

[self addConstraint:[NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self. labelView attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0 ]]; //Specify the X 

[self addConstraint:[NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self. labelView attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0.0 ]]; //Specify Y 

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[circleView(circleSize)]" options:0 metrics:metrics views:views]]; //Dock the circle to the top 
Смежные вопросы