2010-12-12 4 views
9

У меня есть UIView анимацииКак получить UIView кадра происхождение и размер, а анимация

[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDuration:25]; 
myview.frame = CGRectMake(218, 216, myview.frame.size.width * 0.5, myview.frame.size.height * 0.5); 
[UIView commitAnimations]; 

и NSTimer с методом обратного вызова. Вопрос: можно ли получить текущий размер myview.frame и происхождение внутри метода обратного вызова таймера?
или может быть другой способ проследить его?

ответ

12

Я уверен, что это невозможно, потому что, когда вы меняете frame своего вида, он вступает в силу немедленно. В фоновом режиме Core Animation заботится об анимации. Таким образом, даже если вы можете захватить фрейм, он даст вам конечные координаты, а не текущие координаты в середине анимации.

Доступ к слою презентации объекта, как указано в комментариях NWCoder. См. documentation.

[view.layer.presentationLayer frame] 
+0

Да, я заметил (примерно сразу). хорошо, будет искать другой способ ... – heximal

+9

Если кому-то все еще нужно это, это возможно. Вы можете использовать: [[v.layer presentationLayer] frame]; – NWCoder

+0

@NWCoder: Хе-хе, круто! Не знал, что это возможно. –

1

Рамка представления не обновляется во время анимации, как вы поняли. Вы можете попробовать myview.layer.frame (просто догадка, хотя я подозреваю, что это тоже не сработает).

+0

На самом деле, myview.layer.frame отлично справился со мной, как было предложено выше Брайаном. –

3

NWCoder является правильным. Я приведу вам пример на C#, так как я код в MonoTouch.

RectangleF start = new RectangleF(0,0,100,100); 
    RectangleF end = new RectangleF(100,100,100,100); 
    UIView yourView = new UIView(start); 

    UIView.Animate (120d, 0d, UIViewAnimationOptions.CurveLinear, delegate { 
    yourView.Frame = end; 
    }, delegate { }); 

Блок кода, указанный выше, будет перемещать ваш объект с 0,0 до 100,100 за 120 секунд. Когда начнется анимация, у вашегоView.Frame уже установлен (100,100,100,100) ... так что вашView.Frame.X будет равен 100 за все 120 секунд.

С другой стороны, если вы используете первую строку ниже любое время в течение 120 секунд ...

float currentX = yourView.Layer.PresentationLayer.Frame.X 
    float currentProp = yourView.Layer.PresentationLayer.Frame.<any other frame property> 

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

Отлично работает. Сейчас я использую его в своем приложении.

+0

@sudo проголосовал за меня ... потому что я проголосовал за него ... не потому, что мой ответ был неправильным. Довольно детское. Ответ sudo был неправильным и заслужил понижение голосов. –

+0

Извините, просто вышли на ваш комментарий. Я вообще не ответил на ваш ответ. Пожалуйста, не думайте об этом другим людям. –

+0

Мне нечего было принимать. Вы обновили свой пост в тот самый момент, когда мой ответ получил пониженное голосование. Совпадение? Сомнительно. –

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