Как программно изменить положение UIViews при включенном автомакете

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

UIView.center = CGPointMake(x,y);

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

_loginTextLabel.center = CGPointMake(1,1);

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

} completion:nil
 ];
}

person Vimzy    schedule 07.09.2015    source источник
comment
В этом посте есть несколько интересных идей: stackoverflow.com/questions/11368440/ Простое место для начала, попробуйте установить translatesAutoresizingMaskIntoConstraints = YES перед установкой нового центра.   -  person William Smith    schedule 07.09.2015
comment
@WilliamSmith Еще одна проблема. Почему CGPointMake(_loginTextLabel.bounds.origin.x, _loginTextLabel.bounds.origin.y) выдает значение (0,0) при его использовании? Это не правильно. Это тоже проблема авторазметки?   -  person Vimzy    schedule 07.09.2015
comment
Думаю, сначала я спрошу, почему вы думаете, что это неправильно? Свойство bounds определяет отображаемую область UIView относительно фрейма. Обычно по умолчанию это (0, 0, ширина, высота). Из документов Apple Размер прямоугольника границ связан с размером прямоугольника кадра, поэтому изменения одного влияют на другой. Изменение размера границ увеличивает или уменьшает вид относительно его центральной точки. Вы можете прочитать о свойстве bounds здесь: developer.apple.com/library/ios/documentation/UIKit/Reference/   -  person William Smith    schedule 07.09.2015


Ответы (2)


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

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

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

Или, если вы создаете свои ограничения программно, как предложила Apple: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
}];
person John    schedule 07.09.2015
comment
Можете ли вы объяснить, как я на самом деле должен использовать эту строку: yourConstraint.constant = whatYouWant; и для чего это? - person Vimzy; 07.09.2015
comment
@Vimzy Допустим, у вас есть кнопка, и вы создаете выход ее ведущего ограничения в ее суперпредставление с фиксированным значением, например 10, что-то вроде этого: @property (слабое, неатомарное) IBOutlet NSLayoutConstraint *leadingConstraint; Когда вы перемещаете кнопку по горизонтали, вы можете изменить значение ограничения с 10 на любое другое значение, которое вы хотите, поэтому просто присвойте ему новое значение, например: self.leadingConstraint.constant = 100; - person John; 07.09.2015

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

_constraintHeight.constant = 200;

person Abhishek Bhardwaj    schedule 07.09.2015