2014-10-01 2 views
0

У меня есть несколько изображений, которые я хочу переключить. Существует простая функция, я сделал для этого:Переключение изображений с использованием NSTimer

-(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; 
} 
} 

Существует NSTimer, которые называют эту функцию:

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

BOOL isMoved; помещены в реализации класса.

Что я хочу, чтобы удалить изображение, а затем снова показать (и повторить его каждые 2 секунды). Было бы неплохо иметь гладкую анимацию.

Этот код:

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]; 
    } 

Также не работает, не знаю почему. Изображение неподвижно. Я импортировал библиотеку кварца и включал заголовки.

+0

http://stackoverflow.com/questions/7638831/fade-dissolve-when-change-uiimageviews-image/38350024 # 38350024 –

ответ

3

вы можете добиться этого с помощью этого кода: -

#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]; 

и NSTimer Работа должно быть сделано здесь transition.duration. Поэтому больше нет необходимости в NSTimer.

Предоставлено: - https://stackoverflow.com/a/2834693/1865424

Эта часть кода тоже работает: -

// 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]; 
+0

Для чего я выступаю? –

+0

Эдвард, пожалуйста, взгляните на мой обновленный ответ, мне интересно, почему его не работает. Благодарю. –

+0

@EvgeniyKleban я отредактировал мой ответ с более простой версией кода, проверьте, что..и работает как шарм :) – Shivaay

2

Я думаю, что вам нужно:

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

Попробуйте этот код. Это сработало для меня.

#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++; 
} 
1

Это ошибка в коде. После установки isMoved = YES, вы не можете проверить, is isoved == YES.

Я не знаю, если это то, что вы имеете в виду, но попробовать этот код:

-(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 Может быть, этот код поможет вам:

-(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]; 
    }]; 
} 
+0

Pawel, спасибо за вашу помощь, но нет ошибки в проверке состояния (потому что я могу видеть вывод в NSLog). –

+0

@EvgeniyKleban В вашем коде одновременно выполняются оба утверждения «if (! IsMoved)» и «if (isMoved)». Это то, что вы ожидаете? –

+0

Pawel, да, потому что логическое значение объявлено в файле реализации и, следовательно, каждый раз, когда функция называется исполняемой командой.В моем коде это происходит каждые 2 секунды. –

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