2015-06-22 4 views
0

У меня будет несколько UILabels, расположенных горизонтально и по центру. На основе выбора пользователей будут либо 3, 5, либо 7 ярлыков.Позиционирование UILabel

Я хочу, чтобы метки были центрированы в каждом случае.

Пример:

 L1 L2 L3 
    L1 L2 L3 L4 L5 
    L1 L2 L3 L4 L5 L6 L7 

L1, одно и то же в каждом случае и так далее, или просто показывает Hidding другие по мере необходимости. Каждая строка представляет собой уникальный случай.

Попытка использовать ограничения для каждого ярлыка кажется большой работой. Есть лучший способ сделать это???

+0

Это должно быть доступно для ios7 – SteveM

ответ

1

Я рекомендую использовать ограничения. Так что вам не нужно беспокоиться о разных размерах экрана & пейзаж/портрет.

Вы можете проверить визуальный формат создания ограничений. Мне очень удобно: https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/VisualFormatLanguage/VisualFormatLanguage.html

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

Основываясь на том, чего вы хотите достичь. Я думаю, что вы можете установить ограничение, как следующие:

  • сделать их имеют одинаковую высоту/ширину
  • сделать их выравнивание по центру у друга с другими
  • установить координату у любого лейбла
  • множество горизонтальное расстояние между двумя соседними метками

Если вы хотите отобразить L1 L2 L3, просто скройте остальные метки и выровняйте центр x L2 с надписью. Аналогично, если вы хотите отобразить L1 L2 L3 L4 L5, просто выровняйте центр x L3 и скройте остальные метки

После того как вы изменили ограничение, вы можете позвонить -layoutIfNeeded(), чтобы немедленно обновить ограничение (или поместить его в блок анимации для анимации перехода).

+0

Хорошо. Это имеет смысл для меня сейчас после игры с ним больше. Ограничения для меня немного сложны. Как мне настроить программную привязку центра на разных ярлыках по мере необходимости? – SteveM

+0

Скажем, в вашем 'viewDidLoad', вы можете создать новое ограничение, используя NSLayoutConstraint * с = [NSLayoutConstraint constraintWithItem: атрибут self.label1: NSLayoutAttributeCenterX relatedBy: NSLayoutRelationEqual toItem: атрибут self.view: NSLayoutAttributeCenterX множитель: 1 константа: 0] ; . После того, как вы их создадите и сохраните, вы можете удалить их и добавить их во время выполнения.Использование ограничений -addConstraints: (NSArray *) и -removeConstraint: (NSLayoutConstraint *) ограничение – gyan

+0

Спасибо, gyan ..., который отлично поработал. Один вопрос для понимания ... Я установил противопоказания выравнивания центра на ярлыках через Раскадровку, а затем установил выходное соединение с файлом .h. Я мог бы удалить это ограничение во время выполнения, но я не смог добавить его обратно с помощью метода -addcontraint. Вот ошибка: *** Завершение приложения из-за неперехваченного исключения «NSInternalInconsistencyException», причина: «Недопустимый параметр, не удовлетворяющий: [constraint isKindOfClass: [NSLayoutConstraint class]] ' *** Первый стек вызовов броска: просто любопытно, почему не работает. – SteveM

0

Попробуйте новый UIStackView доступен на прошивке 9

+0

Спасибо, но нужно для ios7 – SteveM

+1

UICollectionView? –

0

я обычно делаю что-то вроде этого. Предполагая, что ваши метки уже добавлены в ваш просмотр.

NSArray *labels; 
UIView *yourBaseView; 

CGRect baseFrame = yourBaseView.bounds; 
CGFloat spacer = 10; 

CGRect labelFrame; 
labelFrame.origin = CGPointMake(baseFrame.origin.x + spacer, baseFrame.origin.y); 
labelFrame.size = CGSizeMake((baseFrame.size.width - (labels.count * spacer) - (spacer * 2))/labels.count, baseFrame.size.height); 

for (int i = 0; i < labels.count;++i){ 
    UILabel *label = labels[i]; 
    label.frame = labelFrame; 
    labelFrame.origin.x += labelFrame.size.width + spacer; 
} 
Смежные вопросы