2013-11-25 7 views
1

У меня есть вид в контроллере панели вкладок с UIImageView и UILabel. У меня есть UILabel, поэтому текст появится внутри сердца в UIImageView. В представлении изображения отображается весь вид. Я использую AutoLayout, чтобы разместить все, и чтобы он растягивал изображение, чтобы заполнить весь экран при повороте, но у меня возникают проблемы с получением UILabel, где я хочу.AutoLayout Не работает на UILabel

Я попытался прикрепить верхнюю часть к SuperView, но это приводит к тому, что UILabel будет слишком низким, а привязка к нижней части выталкивает UILabel вне поля зрения при повороте. Вот изображение, показывающее первое.

UPDATE: Я попытался следующий код, но безрезультатно:

-(void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) { 
     NSLog(@"Landscape left"); 
label1.frame = CGRectMake(29, 20, 509, 142); 
     [label1 setFrame:CGRectMake(29, 20, 509, 142)]; 

    } else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) { 
     NSLog(@"Landscape right"); 
     label1.frame = CGRectMake(29, 20, 509, 142); 
     [label1 setFrame:CGRectMake(29, 20, 509, 142)]; 

    } else if (toInterfaceOrientation == UIInterfaceOrientationPortrait) { 
     NSLog(@"Portrait"); 
     [label1 setFrame:CGRectMake(29, 77, 61, 142)]; 
    } 
} 

enter image description here enter image description here

ответ

2

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

NSLayoutConstraint *con = [NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeTop relatedBy:0 toItem:self.view attribute:NSLayoutAttributeBottom multiplier:0.2 constant:-60]; 

подтаблица будет позиционироваться 53,6 пунктов с вершины в портрете и 4 очка от вершины в ландшафте. Это немного больно делать вычисления, чтобы выяснить, какие числа подключиться к ним, поэтому я написал категорию в NSLayoutConstraint, чтобы сделать это для меня. Таким образом, категория имеет один метод, который выглядит следующим образом:

+(NSLayoutConstraint *)topConstraintForView:(UIView *)subview viewAttribute:(NSLayoutAttribute) att superview:(UIView *)superview portraitValue:(CGFloat)pValue landscapeValue:(CGFloat)lValue { 
    CGFloat multiplier = (pValue - lValue)/(superview.bounds.size.height - superview.bounds.size.width); 
    CGFloat constant = pValue - (superview.bounds.size.height * multiplier); 
    NSLayoutConstraint *con = [NSLayoutConstraint constraintWithItem:subview attribute:att relatedBy:0 toItem:superview attribute:NSLayoutAttributeBottom multiplier:multiplier constant:constant]; 
    return con; 
} 

Вы использовать его очень просто, как это:

[self.view addConstraint:[NSLayoutConstraint topConstraintForView:self.label viewAttribute:NSLayoutAttributeTop superview:self.view portraitValue:100 landscapeValue:50]]; 

Это рассчитает правильные значения множителя и постоянная, и положение изображения правильно. В IB у вас должно быть главное ограничение на ваш ярлык, который вы удаляете перед добавлением этого. Вы можете сделать это, отредактировав ограничение и установив флажок, который называется «Удалить место во время сборки».

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

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self.view addConstraint:[self topConstraintForView:self.label viewAttribute:NSLayoutAttributeTop superview:self.view portraitValue:100 landscapeValue:50]]; 
} 



-(NSLayoutConstraint *)topConstraintForView:(UIView *)subview viewAttribute:(NSLayoutAttribute) att superview:(UIView *)superview portraitValue:(CGFloat)pValue landscapeValue:(CGFloat)lValue { 
    CGFloat multiplier = (pValue - lValue)/(superview.bounds.size.height - superview.bounds.size.width); 
    CGFloat constant = pValue - (superview.bounds.size.height * multiplier); 
    NSLayoutConstraint *con = [NSLayoutConstraint constraintWithItem:subview attribute:att relatedBy:0 toItem:superview attribute:NSLayoutAttributeBottom multiplier:multiplier constant:constant]; 
    return con; 
} 
+0

Я пробовал это, но на 'self.view addConstraint' Я получаю метод класса для topConstraintForView не найден. – user717452

+0

@ user717452, вам нужно будет добавить категорию, чтобы сделать это так, как я. Я обновил свой ответ, чтобы показать вам, как это сделать, не добавляя категорию. – rdelmar

+0

Блестящий! Спасибо вам за это! – user717452

0

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

+0

Пытались это с помощью willRotateToInterfaceOrientation, и установив рамки для UILabel для каждой ориентации, но это не сделано никаких изменений вообще. Я добавил NSLogs для каждой ориентации, и они правильно срабатывают при повороте, но кадр не работает. – user717452

+0

Вы подключили IBOutlet? – GuybrushThreepwood

+0

Да. Проверено только сейчас. – user717452

0

Скорее всего, вам понадобится сделать текст меньшим размером, чтобы динамически вписаться в сердце. Также, если сердце не является собственностью, сделайте его своим. Это поможет автоматическому макету знать, как лучше определить себя. Также, чтобы помочь, возможно, получить больше понимания, это отличный ресурс http://nsscreencast.com/episodes/35-autolayout-fun

Удачи.

0

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

enter image description here

, а затем установите связь> = ​​или < = или == зависимости от ваших потребностей. Также задано количество строк в построителе интерфейса.

enter image description here

Ссылка: https://medium.com/@elgoni/ios-7-auto-layout-3e50cd1d1278

Смежные вопросы