CoreAnimation, перемещение UIImageView с анимацией тени в iOS 5 Xcode 4 - PullRequest
4 голосов
/ 07 февраля 2012

Я пытаюсь добавить (поддельный) 3d-подобный эффект для изображения (UIImageView перемещается из точки A в B, во время этого движения я хочу в точке C = (A + B) / 2, чтобы оно имело самую большую теньразмер (или большее смещение тени), поэтому похоже, что он снова идет вверх и вниз. Когда я пытаюсь даже изменить размер тени, это не анимация. Не могли бы вы помочь мне, как редактировать этот код:

NSValue *pointB = [NSValue valueWithCGPoint:CGPointMake(CGRectGetMinX(imageView.frame)+50, CGRectGetMinY(imageView.frame)+50)];
[self.view bringSubviewToFront:ImageView];    
[UIView beginAnimations:@"UIImage Move" context:NULL];
CGPoint point = [pointB CGPointValue];
CGSize size =imageView.frame.size;
[UIView setAnimationDuration:1.0];
imageView.frame = CGRectMake(point.x, point.y, size.width, size.height);
imageView.layer.shadowOffset = CGSizeMake(0, 4); //actually I want this to happen in mid point and revert to offset 1
[UIView commitAnimations];


//sorry for possible problems with syntax, the code works fine, I had to rewrite and simplify it for understanding

1 Ответ

10 голосов
/ 07 февраля 2012

Вам необходимо анимировать shadowOffset слоя с помощью CAAnimation.Вот пример того, как увеличить shadowOffset при перемещении объекта.В этом примере используется UIButton.

#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>
@interface ViewController : UIViewController 
@property (nonatomic, retain) IBOutlet UIButton *button;
@end

В файле M я вызываю анимации на кнопке с помощью кнопок IBAction.

-(IBAction)shadowGrow:(id)sender {
    CABasicAnimation *shadowGrow = [CABasicAnimation animationWithKeyPath:@"shadowRadius" ];
    shadowGrow.delegate = self;
    [shadowGrow setFromValue:[NSNumber numberWithFloat:3.0]];
    [shadowGrow setToValue:[NSNumber numberWithFloat:20.0]];
    [shadowGrow setDuration:1.0f];
    shadowGrow.autoreverses = YES;

    CABasicAnimation *move = [CABasicAnimation animationWithKeyPath:@"transform.translation.x" ];
    move.delegate = self;
    [move setFromValue:[NSNumber numberWithFloat:0]];
    [move setToValue:[NSNumber numberWithFloat:50]];
    [move setDuration:1.0f];
    move.autoreverses = YES;

    //Add animation to a specific element's layer. Must be called after the element is displayed.
    [[button layer] addAnimation:shadowGrow forKey:@"shadowRadius"];
    [[button layer] addAnimation:move forKey:@"transform.translation.x"];
}

При использовании CoreAnimation следует помнить одну вещь:таким свойствам они будут возвращаться к своим значениям с самого начала, если только вы не установите эти значения после окончания анимации в методе делегирования CAAnimation.

- (void) animationDidStop:(NSString *)theAnimation finished:(NSNumber *)finished context:(void *)context

Вот некоторая дополнительная информация об анимируемых свойствах CALayer.1010 *

Свойства анимации слоя и фильтра CIF

...