Evgeniy Kleban
Evgeniy Kleban

Reputation: 6940

Switching images using NSTimer

I have couple of images i want to switch. There is a simple function i made for do this:

-(void)imageSlide{

if (!isMoved){
CGRect frame = self.imageSlideshow.frame;
frame.origin.x = self.imageSlideshow.frame.origin.x - 320;
self.imageSlideshow.frame = frame;
NSLog(@"1 caze work");
isMoved = YES;
}

if (isMoved){
CGRect frame = self.imageSlideshow.frame;
frame.origin.x = self.imageSlideshow.frame.origin.x + 320;
self.imageSlideshow.frame = frame;
NSLog(@"2 caze work");
isMoved = NO;
}
}

There is NSTimer which call that function:

[NSTimer scheduledTimerWithTimeInterval:2.0
                                         target:self
                                       selector:@selector(imageSlide)
                                       userInfo:nil
                                        repeats:YES];

BOOL isMoved; placed in implementation of class.

What i want is, to remove an image and then, shown again (and repeat it every 2 seconds). It would be nice to have smooth animation as well.

That code:

for (int i=0; i<99; i++){

        self.imageSlideshow.image = [UIImage imageNamed:(i % 2) ? @"ipd1.jpg" : @"ipd2.jpg"];

        CATransition *transition = [CATransition animation];
        transition.duration = 1.0f;
        transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
        transition.type = kCATransitionFade;

        [self.imageSlideshow.layer addAnimation:transition forKey:nil];
    }

Also not working, no idea why. Image stand still. I did import quartz library and include headers.

Upvotes: 0

Views: 757

Answers (4)

Kundan
Kundan

Reputation: 3082

you can acheive this by using this code :-

#import <QuartzCore/QuartzCore.h>
...
imageView.image = [UIImage imageNamed:(i % 2) ? @"3.jpg" : @"4.jpg"];

CATransition *transition = [CATransition animation];
transition.duration = 2.0f;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionFade;

[imageView.layer addAnimation:transition forKey:nil];

and NSTimer Job should be done here by transition.duration. So, no need of NSTimer anymore here.

Courtesy :- https://stackoverflow.com/a/2834693/1865424

This piece of code works too :-

 // create the view that will execute our animation
 UIImageView* imageSlideshow = [[UIImageView alloc] initWithFrame:self.view.frame];

 // load all the frames of our animation
 imageSlideshow.animationImages = [NSArray arrayWithObjects:    
                             [UIImage imageNamed:@“ipd1.jpg"],
                             [UIImage imageNamed:@“ipd2.jpg"], nil];

 // all frames will execute in 1.75 seconds
 imageSlideshow.animationDuration = 1.75;
 // repeat the animation forever
 imageSlideshow.animationRepeatCount = 0;
 // start animating
 [imageSlideshow startAnimating];
 // add the animation view to the main window 
 [self.view addSubview:imageSlideshow];

Upvotes: 3

pawel_d
pawel_d

Reputation: 487

It is bug in your code. After setting isMoved = YES, you can't check if isMoved == YES.

I don't know if that is what you mean, but try this code:

-(void)imageSlide{

    [UIView animateWithDuration:1 animations:^{
        if (!isMoved){
            CGRect frame = self.imageSlideshow.frame;
            frame.origin.x = self.imageSlideshow.frame.origin.x - 320;
            self.imageSlideshow.frame = frame;
            NSLog(@"1 caze work");
            isMoved = YES;
        }
        else
        {
            CGRect frame = self.imageSlideshow.frame;
            frame.origin.x = self.imageSlideshow.frame.origin.x + 320;
            self.imageSlideshow.frame = frame;
            NSLog(@"2 caze work");
            isMoved = NO;
        }

    } completion:^(BOOL finished) {
    }];
}

EDIT Maybe this code will help you:

-(void)slideshow
{
    static int i = 0;
    UIImage * img = [UIImage imageNamed:(i % 2) ? @"ipd1.jpg" : @"ipd2.jpg"];

    [UIView transitionWithView:self.imageSlideshow duration:1.0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
        self.imageSlideshow.image = img;
    } completion:^(BOOL finished) {
        i++;
        [self performSelector:@selector(slideshow) withObject:nil afterDelay:2.0];
    }];
}

Upvotes: 1

ssmanohar
ssmanohar

Reputation: 186

Try this code. It is worked for me.

#pragma mark -
#pragma mark viewDidAppear
-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];

    updateBCK = [NSTimer scheduledTimerWithTimeInterval:(4.0) target:self selector:@selector(changeImage) userInfo:nil repeats:YES];
    [updateBCK fire];

}

#pragma mark -
#pragma mark viewDidDisAppear
-(void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
    if ([updateBCK isValid]){
        [updateBCK invalidate];
        updateBCK = nil;
    }
}
-(void)changeImage{
    static int i=0;
    if (i == [myImages count]){
        i=0;
    }
    [UIImageView beginAnimations:nil context:NULL];
    [UIImageView setAnimationDuration:0.6];
    backgroundImageView.alpha=1; 
    backgroundImageView.image =[myImages objectAtIndex:i];

    [UIImageView commitAnimations];
    i++;
}

Upvotes: 1

Raymond Array Wang
Raymond Array Wang

Reputation: 196

I think you need:

[UIView animateWithDuration:1 options:UIViewAnimationOptionCurveEaseIn 
   animations:^{
      //Change frame here.
   } completion:^ (BOOL completed) {}         
];

Upvotes: 2

Related Questions