2013-04-22 2 views
0

Я хочу создать представление, такое как QuickActionBar на Android, которое при нажатии на кнопку в левом верхнем углу открывается просто, но оно выглядит так, как будто они идут справа, нажимают на левой стены, и отскочил назад, а затем остановился. вид появляется, но я не могу анимировать подсмотры ..Анимированные подпрограммы слева-справа-слева

ответ

0

CAKeyframeAnimation выглядит правильно для вашей проблемы. Я написал эту функцию анимации раньше для ярлыка, сдвигающегося по экрану. Я немного обновил xValues ​​для ваших целей, но, скорее всего, вам придется поиграть с ними. Также после удара стены вы можете играть со значением scale.y, вы можете легко интегрировать это в анимацию ключевого кадра.

+ (void) slideAcrossScreen:(UIView *) view Duration:(CGFloat) duration FromLeft:(BOOL) fromLeft 
{ 
    //This is to make it work with both left-right-left and right-left-right anims. 
    CGFloat slideLength = fromLeft ? -view.frame.origin.x : [[UIScreen mainScreen] bounds].size.width - (view.frame.origin.x + view.frame.size.width); 

    CAKeyframeAnimation *anim = [CAKeyframeAnimation animationWithKeyPath:@"transform.translation.x"]; 

    NSArray *xValues = 
       @[[NSNumber numberWithFloat:view.bounds.origin.x], 
       [NSNumber numberWithFloat:view.bounds.origin.x + 10 * slideLength/10], 
       [NSNumber numberWithFloat:view.bounds.origin.x + 10 * slideLength/10], 
       [NSNumber numberWithFloat:view.bounds.origin.x + 9 * slideLength/10]]; 

    [anim setValues:xValues]; 

    NSArray *timeFrames = 
       @[[NSNumber numberWithFloat:0.0], 
       [NSNumber numberWithFloat:0.85], 
       [NSNumber numberWithFloat:0.9], 
       [NSNumber numberWithFloat:1.0]]; 

    [anim setKeyTimes:timeFrames]; 
    [anim setDuration:duration]; 
    [anim setFillMode:kCAFillModeForwards]; 
    [anim setRemovedOnCompletion:FALSE]; 

    [view.layer addAnimation:anim forKey:@"slide"]; 
} 
+0

Почему 'timesFrames' не содержит значений между 0.0 и 0.85 ?? – Subbu

+0

вы можете редактировать их, как вам нравится 0.85 - время, когда оно попадает в стену. Времена привязаны к xValues, определенным выше, поэтому в момент времени 0.0 он будет в начальной позиции, тогда до 0.85 он будет скользить с фиксированной скоростью, пока не попадет в стену. – guenis

0

Я просто потрачу 15 минут, чтобы решить вашу проблему, поскольку анимационный вид всегда интересен. Итак, вот фрагмент, вы передаете его view, и он будет оживлять его. Конечно, вы можете добавить еще немного, если хотите.

+ (void) animateView : (UIView *) view{ 
    __block CGRect frame = view.frame; 
    frame.origin.x = - 320; 
    [view setFrame:frame]; 
    [UIView animateWithDuration:1.5f animations:^{ 
     frame.origin.x = 10.0f; 
     frame.size.width = 310.0f; 
     [view setFrame:frame]; 
    } completion:^(BOOL finished) { 
     if (finished) { 
      [UIView animateWithDuration:0.5 animations:^{ 
       frame.origin.x = 0.0f; 
       frame.size.width = 320.0f; 
       [view setFrame:frame]; 
      } completion:^(BOOL finished) { 
      }]; 
     } 
    }]; 
} 

Cheers.

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