Вы можете посмотреть исходный код для поддержки ячейки TweetStation «swipe», которая выполняет анимацию сразу:
- Анимирует ячейку вправо
- Она исчезает взначки
- Значения растут, а затем уменьшаются до их размера
- Отскакивает предыдущее существующее меню
Все они выполняются в одной транзакции.Исходный код находится в:
https://github.com/migueldeicaza/TweetStation/blob/06e2ae5484103a85660201592bd7f06fb1b69395/TweetStation/UI/SwipeSupport.cs
Анимации фактически распространены в разных местах.SwipeMenuView настраивает свою собственную анимацию (переход значков в фоновый режим, увеличение / уменьшение значков) в своем конструкторе, и анимация добавляется в CAAnimationGroup, а полученная анимация добавляется в слой с помощью layer.AddAnimation (group):
Фрагмент кода этого метода приведен здесь:
var alpha = (CAKeyFrameAnimation) CAKeyFrameAnimation.FromKeyPath ("opacity");
alpha.Values = new NSNumber [] {
NSNumber.FromFloat (0),
NSNumber.FromFloat (0.1f),
NSNumber.FromFloat (1),
};
alpha.KeyTimes = new NSNumber [] {
NSNumber.FromFloat (0),
NSNumber.FromFloat (1f/(layers.Length-i)),
NSNumber.FromFloat (1),
};
var size = (CAKeyFrameAnimation) CAKeyFrameAnimation.FromKeyPath ("transform.scale");
size.Values = new NSNumber [] {
NSNumber.FromFloat (0.7f),
NSNumber.FromFloat (1.3f),
NSNumber.FromFloat (1),
};
var group = CAAnimationGroup.CreateAnimation ();
group.Animations = new CAAnimation [] { alpha, size /*, pos */ };
group.Duration = delay;
layer.AddAnimation (group, "showup");
Другая часть анимации настроена в ShowMenu, которая смахивает ячейку с экрана, и если она уже былаотображаемое меню оживляет ячейку, возвращая ее обратно в новое местоположение:
ShowMenu запускает анимацию, группируя изменения в блоке транзакции, ограниченном UIView.BeginAnimations () и UIView.CommitAnimations:
UIView.BeginAnimations ("Foo");
UIView.SetAnimationDuration (hideDelay);
UIView.SetAnimationCurve (UIViewAnimationCurve.EaseInOut);
var animation = MakeBounceAnimation (Math.Abs (offset), "position.x");
foreach (var view in menuCell.ContentView.Subviews){
if (view == currentMenuView)
continue;
view.SetNeedsDisplay ();
AnimateBack (view, animation);
}
AnimateBack (menuCell.SelectedBackgroundView, animation);
UIView.CommitAnimations ();
Анимация меню создается с эффектом отскакивания:
CAAnimation MakeBounceAnimation (float offset, string key)
{
var animation = (CAKeyFrameAnimation) CAKeyFrameAnimation.FromKeyPath (key);
animation.Duration = hideDelay;
float left = offset/2;
animation.Values = new NSNumber [] {
NSNumber.FromFloat (offset+left),
NSNumber.FromFloat (left-30),
NSNumber.FromFloat (left+10),
NSNumber.FromFloat (left-10),
NSNumber.FromFloat (left),
};
return animation;
}
Метод AnimateBack просто присоединяет анимацию:
void AnimateBack (UIView view, CAAnimation animation)
{
var b = view.Bounds;
view.Layer.Position = new PointF (b.Width/2, b.Height/2);
view.Layer.AddAnimation (animation, "position");
}