Переместить UIView с начальной точкой

У меня есть этот код ниже, который перемещает мой UIView влево:

- (void)viewDidLoad {
    [super viewDidLoad];

    [UIView beginAnimations:nil context:NULL];

        [UIView setAnimationDuration:4];

        int xOriginal = 91;

        CGRect rect = imagem.frame;

        int x = rect.origin.x;
        int y = rect.origin.y;
        int w = rect.size.width;
        int h = rect.size.height;

        if(x == xOriginal){

            imagem.frame = CGRectMake(x+100, y, w, h);
        }else{

            imagem.frame = CGRectMake(x-100, y, w, h);
        }

        [UIView commitAnimations];

}

Моя координата моего представления: x = 91 (центр superView). Когда я запускаю свое приложение, мой UIView начинается слева и переходит в центр, а не в центр и идет вправо. Почему это происходит?

Как заставить мой UIView начинаться в центре (x = 91) и идти вправо (91 + 100), а не влево в центр?


person user3781174    schedule 19.12.2014    source источник
comment
Вы используете авторазметку? Вы поместили свою анимацию в метод контроллера -viewDidLoad? Вы также можете использовать одну из функций +[UIView animateWith...]   -  person Crazyrems    schedule 19.12.2014
comment
Когда вы создаете представление, вы, вероятно, устанавливаете его начальный кадр в «неправильном» месте. Пожалуйста, покажите код, где вы устанавливаете начальный кадр представления.   -  person AMI289    schedule 19.12.2014
comment
Я обновляю свой пост, это весь код в моем приложении (в данном случае мое приложение очень простое). Я помещаю свой код в метод viewdidload, и мое представление использует автоматическую компоновку.   -  person user3781174    schedule 19.12.2014
comment
В начале viewDidLoad попробуйте программно установить кадр в правильную позицию, т.е. self.frame = CGRectMake(91, WANTED_Y_POSITION, WANTED_WIDTH, WANTED_HEIGHT);   -  person AMI289    schedule 19.12.2014


Ответы (3)


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

Вы можете создать выходы из ваших ограничений и установить свойство constant ограничения в вашем коде для перемещения ваших представлений.
Вы также вызываете -[view layoutIfNeeded] для обновления ваших ограничений в блоке анимации.

В противном случае вы можете удалить все свои ограничения просмотра и безбоязненно анимировать его кадр.

person Crazyrems    schedule 19.12.2014
comment
Эй, чувак, это работает, я отключил AutoLayout и работает нормально, теперь изображение начинается с центра и идет вправо, а не влево в центр, спасибо. - person user3781174; 19.12.2014
comment
Вы можете делать анимацию с помощью AutoLayout, но вам нужно использовать другой подход. Вместо того, чтобы анимировать положение вашего представления напрямую, вы анимируете изменения ограничений представления. - person Duncan C; 19.12.2014
comment
@DuncanC У вас есть учебник, который учит, как анимировать с включенным автоматическим макетом? - person user3781174; 19.12.2014
comment
Я только занимался анимацией с помощью AutoLayout. У меня есть проект на github, в котором показано, как использовать анимацию ограничений для смещения представлений вверх при появлении клавиатуры, но код представлен только в виде комментариев. Посетите github.com/DuncanMC/RandomBlobs и посмотрите раздел в уценке о смещении представлений, чтобы сделать место для клавиатуры. - person Duncan C; 19.12.2014
comment
Я только что добавил еще один ответ, который объясняет, как это сделать. - person Duncan C; 19.12.2014

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

Вместо этого вам нужно анимировать ограничение, прикрепленное к представлению.

Что вы делаете, так это создаете ограничение (или несколько ограничений) и подключаете его к IBOutlet. Затем в коде анимации вы вычисляете изменения ограничений и изменяете константу для соответствующих ограничений.

Например, если вы хотите сместить вертикальное положение представления, установите ограничение, которое задает вертикальное положение вашего представления, и свяжите его с IBOutlet с именем viewConstraint. Затем вы должны использовать такой код:

[myView animateWithDuration: .25
  animations: ^
  {
    viewConstraint.constant -= shiftAmount;
    [self.view layoutIfNeeded];
  }
];
person Duncan C    schedule 19.12.2014

person    schedule
comment
Хотя код правильный, он не дает прямого ответа на его вопрос, поскольку он спрашивает о перемещении вида из источника x из 91 в сторону 191, а ваш пример перемещает его из исходного x из 0 в 100. Если вы его отредактируете, вероятно, будет исключено в качестве ответчика. - person AMI289; 19.12.2014