2016-01-23 2 views
-1

Я пытаюсь создать пользовательский индикатор активности, он имеет два изображения, одно изображение будет статическим (в фоновом режиме), а другое изображение будет спереди, оно должно перемещаться влево, вправо, вверх и вниз (просто чтобы оживить анимацию). Я попытался использовать следующий код (его неправильный). Может кто-нибудь мне помочь, как сделать анимациюiOS: Индикатор пользовательской активности

UIImage *statusImage = [UIImage imageNamed:@"image1.png"]; 
UIImageView *activityImageView = [[UIImageView alloc] 
            initWithImage:statusImage]; 


//Add more images which will be used for the animation 
activityImageView.animationImages = [NSArray arrayWithObjects: 
            [UIImage imageNamed:@"image1.png"], 
            [UIImage imageNamed:@"image2.png"], nil]; 


//Set the duration of the animation (play with it 
//until it looks nice for you) 
activityImageView.animationDuration = 7; 

activityImageView.frame = CGRectMake(
            self.view.frame.size.width/2 
            -statusImage.size.width/3, 
            self.view.frame.size.height/2 
            -statusImage.size.height/3, 
            statusImage.size.width/3, 
            statusImage.size.height/3); 

//Start the animation 
[activityImageView startAnimating]; 
+0

плз не инициируют ImageView с изображением '[[UIImageView Alloc] initWithImage: statusImage];' пытаются инициировать с рамкой или только инициализации. –

+0

@ RatulSharker почему бы и нет? В чем ваш смысл? –

ответ

0

UIImageView можно анимировать через образы, вроде как GIF. То, что вы, , может быть достигнуто гораздо элегантнее, используя CAAnimation. Этот код дает показываю вам анимацию налево и направо:

- (CATransform3D) moveToRight 
{ 
    return [self moveWithScale:CGSizeMake(0.25f, 1.5f)]; 
} 
- (CATransform3D) moveToLeft 
{ 
    return [self moveWithScale: CGSizeMake(-0.25f, 1.5f)]; 
} 
- (CATransform3D) moveWithScale: (CGSize) scale 
{ 
    CGAffineTransform scaleTransform CGAffineTransformMakeScale(ABS(scale.width), scale.height); 
    CGFloat XTranslationFactor = (1.0f - ABS(scale.width))/2.0 * (ABS(scale.width)/scale.width); 

    CGAffineTransform translationTransform = CGAffineTransformMakeTranslation(XTranslationFactor * self.bounds.size.width, 
                      0.0f); 
    CGAffineTransform completeTransform = CGAffineTransformConcat(scaleTransform, translationTransform); 

    CATransform3D transform3D = CATransform3DMakeAffineTransform(completeTransform); 
    return transform3D; 
} 
- (NSArray *) keyFrameAnimationValues 
{ 
    values = @[[NSValue valueWithCATransform3D: [self moveToLeft]], 
       [NSValue valueWithCATransform3D: [self moveToRight]], 
       [NSValue valueWithCATransform3D: [self moveToTop]], 
       [NSValue valueWithCATransform3D: [self moveToBottle]] 
       ]; 
} 

- (void) startAnimating 
{ 
    NSArray * values = [self keyFrameAnimationValues]; 
    NSInteger frameCount = frameValues.count; 
    CAKeyframeAnimation *keyFrameAnimation = [CAKeyframeAnimation animationWithKeyPath: @"transform"]; 
    keyFrameAnimation.duration = 7; 
    keyFrameAnimation.calculationMode = kCAAnimationCubic; 
    keyFrameAnimation.values = [self keyFrameAnimationValues]; 
    // this next part could be done a little more generic 
    // by constructing the array dynamically using a for loop, 
    // but this will give you an idea 
    keyFrameAnimation.keyTimes = @[@(1.0f/frameCount), 
            @(2.0f/frameCount), 
            @(3.0f/frameCount), 
            @(4.0f/frameCount) 
           ]; 
    keyFrameAnimation.repeatCount = HUGE_VALF; 
    [self.layer addAnimation: keyFrameAnimation forKey: @"myAnimation"]; 
} 
+0

это решение выглядит работоспособным, я проверю его и вернусь к вам –

0

Создать CAAnimation для слоя, который вы хотите переместить на каждые углы и добавить его в качестве объекта позиционирования. Надеюсь, что это помогает

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