2015-09-07 3 views
1

Я уже давно застрял в этой проблеме. При разработке приложений iOS в объекте-c, как мы можем программным образом изменить положение (местоположение) UIView при включении Autolayout? Это так просто без Autolayout, так как мы просто указать новый центр для UIView как таковые:Как программно изменить положение UIView при включении автоопределения

UIView.center = CGPointMake(x,y); 

Однако, выше уже не работает из-за Autolayout. В конечном счете, я пытаюсь оживить определенный UIView, используя преобразование трансляции слева направо. Для этого, однако, мне нужно переместить UIViews программно, чего я в настоящее время не могу сделать. Ниже то, что я пытаюсь сделать, по существу (но он не работает из-за autolayout):

_loginTextLabel.center = CGPointMake(1,1); 

[UIView animateWithDuration:0.5 delay:0.5 options:nil animations:^{ 
    _loginTextLabel.center= CGPointMake(5, 1); 

} completion:nil 
]; 
} 
+0

В этом посте есть несколько интересных идей: http://stackoverflow.com/questions/11368440/can-i-disable-autolayout-for-a-specific-subview-at-runtime Простое место для начала, попробуйте установка 'translatesAutoresizingMaskIntoConstraints = YES' перед установкой нового центра. –

+0

@WilliamSmith Еще одна проблема. Почему «CGPointMake (_loginTextLabel.bounds.origin.x, _loginTextLabel.bounds.origin.y)« производит значение (0,0), когда я его использую? Это не правильно. Это также проблема автозапуска? – Vimzy

+0

Наверное, сначала я спрошу, почему вы думаете, что это неправильно? Свойство bounds определяет допустимую область UIView относительно кадра. Обычно он по умолчанию равен (0, 0, ширина, высота). Из документов Apple «Размер прямоугольника границ связан с размером прямоугольника рамки, так что изменения одного влияют на другой. Изменение размера границ увеличивает или уменьшает представление относительно его центральной точки». Вы можете прочитать свойство bounds здесь: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/#//apple_ref/occ/instp/UIView/bounds –

ответ

1

На самом деле вы можете разместить свой _loginTextLabel в - (void)viewDidLayoutSubviews (или - (void)layoutSubviews, если он находится в вашем пользовательском представлении) без автозапуска, тогда вы можете анимировать свой вид, как и раньше, без каких-либо проблем.

Если макет вашего представления с помощью autolayout из СИБА, то вы можете создать выходы вашего ограничения, как говорит Абхишек, в основном, как это:

[self.view layoutIfNeeded]; 
yourConstraint.constant = whateverYouWant; 
[UIView animateWithDuration:1.0 animations:^{ 
    [containerView layoutIfNeeded]; } 
]; 

Или, если вы создаете свои ограничения программно, как яблоко, предложенное : https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/AutolayoutPG.pdf

это в основном, как вы делали с СИБ, разница в том, что вы просто сделать ваши сдерживающие изменения в блоке анимации

[containerView layoutIfNeeded]; 
[UIView animateWithDuration:1.0 animations:^{ 
// Make all constraint changes here 
[containerView layoutIfNeeded]; // Forces the layout of the subtree animation 
block and then captures all of the frame changes 
}]; 
+1

Можете ли вы объяснить, как я Фактически предполагается использовать эту строку: «yourConstraint.constant = whateverYouWant;» и для чего он нужен? – Vimzy

+0

@ Vimzy Скажем, у вас есть кнопка, и вы создаете выход своего главного ограничения для своего супервизора с фиксированным значением, вроде 10, что-то вроде этого: @property (слабый, неатомный) IBOutlet NSLayoutConstraint * leadingConstraint; Когда вы перемещаете свою кнопку горизонтально, вы можете изменить значение своего ограничения от 10 до любого другого значения, которое вы хотите, поэтому просто дайте ему новое значение, например: self.leadingConstraint.constant = 100; – John

0

Для того, чтобы справиться с авторазметками программным образом, необходимо создать IBOutlets вашего Constraint, они класс NSLayoutConstraints, и где вы хотите изменить позицию или фрейм, вам нужно вызвать updateConstraintsIfNeeded на вашем представлении. Затем вам нужно установить значение float в свойство Constant вашей розетки.

_constraintHeight.constant = 200;

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