Есть ли способ получить положение (или центр) из незаконченной анимации UIView? - PullRequest
4 голосов
/ 26 января 2010

У меня UIView делает простую анимацию. Он регулирует свою позицию у от 100 до 130, а затем меняет направление. Я хочу, чтобы он продолжал повторяться, поэтому я установил счетчик повторений на 999. После ввода пользователя я хочу взять тот же UIView и отрегулировать положение x. Это делается с помощью другой анимации UIView. Проблема в том, что когда начинается вторая анимация, первая анимация (которая проходит от 100 до 130 в направлении у) просто внезапно заканчивается (как я читал, что должно). Есть ли способ получить окончательную позицию координаты y этого UIView, прежде чем он был закончен? В идеале я хотел бы, чтобы UIView оставался в том же положении y, в котором он находился, пока я переводил координаты x.

Сводка: UIView перемещается в направлении y от 100-130, разворачивается и повторяется до тех пор, пока не будет получен пользовательский ввод. После получения анимация обрывается, и UIView переходит к y = 130. Я хотел бы узнать, каким было окончательное значение y до того, как анимация была прервана, поэтому, когда используется новая анимация с переводом x, UIView не перепрыгнет на 130, а останется на той же позиции, в которой он находился, когда 1-й анимация закончилась.

Кажется, я не вижу ничего, что позволило бы тебе это сделать. Мне кажется, что как только вы приведете анимацию в движение с помощью UIView, тогда она (и все текущие изменения состояния) будут не в ваших руках и будут «возвращены» вашему контролю и доступности только после того, как анимация будет завершена и в назначенный конечная точка Это правильно? Любое понимание будет оценено. Спасибо за ваше время.

Ответы [ 3 ]

9 голосов
/ 26 января 2010

Вы ищете «слой представления».

Каждый UIView визуализируется с использованием слоя Core Animation, который доступен из свойства layer UIView.

CALayer имеет метод presentationLayer , который возвращает CALayer, который представляет «близкое приближение к версии слоя, который отображается в данный момент».

Итак, чтобы получить текущую позицию вашего вида:

CGRect currentViewFrame = [[myView.layer presentationLayer] frame];
0 голосов
/ 26 января 2010

Возможно, для того, что вы пытаетесь выполнить, было бы полезно немного больше контролировать анимацию. Для этой задачи я бы предложил использовать NSTimer, запланированный с любым интервалом, который лучше всего подходит для вас (от 1/30 до 1/60), и просто настраивать положение UIView каждый раз, когда срабатывает таймер. Таким образом, вы всегда можете получить доступ к компонентам X и Y позиции представления.

Что-то вроде:

- (void)timerFired:(NSTimer *)timer {
    CGPoint p = view.center;

    if (p.y >= 130.0) {
        positiveMovement = NO;
    }
    else if (p.y <= 100.0) {
        positiveMovement = YES;
    }

    if (positiveMovement)
        p.y++;
    else
        p.y--;

    view.center = p;
}

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

0 голосов
/ 26 января 2010

Я не уверен, что это именно то, что вам нужно, но setAnimationBeginsFromCurrentState: UIView, используемый внутри блока beginAnimations, заставит анимацию x запускаться везде, где выполняется y.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...