2011-04-11 13 views
8

wat voglio mostrare un'immagine nell'immagine e dissolvere l'immagine dopo 5 secondi e mostrare l'immagine successiva. Le immagini sono memorizzate in un oggetto matrice ... sono riuscito a effettuare una transizione riuscita tra le immagini dopo 5 secondi. Quello che voglio è dissolvere la prima immagine dopo 5 secondi e mostrare la successiva che deve accadere in un ciclo infinito ... di seguito è riportato il codice e funziona davvero bene per la normale transizione tra le immagini. wat voglio sta svanendo di immagini ... e dovessi aggiungere dissolvenze transizione nel codice qui sottosbiadimento iphone delle immagini

- (void)viewDidLoad { 

    imgView.animationImages=[NSArray arrayWithObjects: 
          [UIImage imageNamed:@"lori.png"], 
          [UIImage imageNamed:@"miranda.png"], 
          [UIImage imageNamed:@"taylor.png"], 
          [UIImage imageNamed:@"ingrid.png"], 
          [UIImage imageNamed:@"kasey.png"], 
          [UIImage imageNamed:@"wreckers.png"], nil]; 


    imgView.animationDuration=20.0; 
    imgView.animationRepeatCount=0; 
    [imgView startAnimating]; 
    [self.view addSubview:imgView]; 
    [imgView release]; 



    [super viewDidLoad]; 
} 

risposta

5

È possibile utilizzare un NSTimer ripetendo a chiamare un metodo speciale che anima la proprietà vista alpha immagine da 0.0 a 1.0 in modo continuo . Ecco il codice che ho scritto che funziona:

- (void)viewDidLoad { 
    imgView.animationImages=[NSArray arrayWithObjects: 
          [UIImage imageNamed:@"lori.png"], 
          [UIImage imageNamed:@"miranda.png"], 
          [UIImage imageNamed:@"taylor.png"], 
          [UIImage imageNamed:@"ingrid.png"], 
          [UIImage imageNamed:@"kasey.png"], 
          [UIImage imageNamed:@"wreckers.png"], nil]; 



    imgView.animationDuration=20.0; 
    imgView.animationRepeatCount=0; 
    [imgView startAnimating]; 
    [self.view addSubview:imgView]; 
    [imgView release]; 
    //The timers time interval is the imageViews animation duration devided by the number of images in the animationImages array. 20/5 = 4 
    NSTimer *timer = [NSTimer timerWithTimeInterval:4.0 
               target:self 
              selector:@selector(onTimer) 
              userInfo:nil 
              repeats:YES]; 

    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; 
    [timer fire]; 

    [super viewDidLoad]; 
} 

//It is important that the animation durations within these animation blocks add up to 4 
//(the time interval of the timer). If you change the time interval then the time intervals 
//in these blocks must also be changed to refelect the amount of time an image is displayed. 
//Failing to do this will mean your fading animation will go out of phase with the switching of images. 

-(void)onTimer{ 
     [UIView animateWithDuration:3.0 animations:^{ 
      imgView.alpha = 0.0; 
     }]; 
     [UIView animateWithDuration:1.0 animations:^{ 
      imgView.alpha = 1.0; 
     }]; 
    } 

Se si desidera che la durata di dissolvenza a durare per 5 secondi invece di 4, è necessario aumentare la vostra proprietà viste animationDuration immagine a 25, e quindi aumentare l'animazione dissolvenza durate nei due blocchi in modo tale che il tempo di somma di dissolvenza = 5.

+1

entrambe le animazioni inizieranno immediatamente e contemporaneamente, vero? è preferibile utilizzare animateWithDuration: animazioni: completamento: in cui la seconda animazione viene attivata al completamento della prima animazione. E ho impostato le durate delle animazioni in modo che si adattino alla visualizzazione delle immagini modificando la durata. O modificare manualmente le immagini nel metodo onTimer, che è meglio se si anima comunque dal codice. –

+0

@saman: ho provato il codice di cui sopra sono stato in grado di ottenere l'effetto dissolvenza. Quello che voglio è la prima immagine a svanire e mostrare il prossimo e il secondo svanire mostrare il prossimo .... ecc. Wat im ottenere è dissolvenza della prima immagine improvvisa transizione della seconda immagine e poi seconda dissolvenza dopo un millisecondo che mostra ancora la seconda immagine den transizione improvvisa del terzo ... cud u help me – kingston

+0

Vuoi dire che mentre l'immagine attuale si attenua, tu vuoi che la prossima immagine sbiadisca? In modo che non svanisca in bianco, sfuma direttamente nell'immagine successiva? – Sabobin

3

@ user652878 Questa answeres tua domanda per quanto riguarda dissolvenza seemlessly da un'immagine all'altra:

Creare le seguenti proprietà nel vostro controller Visualizza intestazione:

UIImageView *imageViewBottom, *imageViewTop; 
    NSArray *imageArray; 

Quindi aggiungere il codice al file implimentaion:

int topIndex = 0, prevTopIndex = 1; 
- (void)viewDidLoad { 

    imageViewBottom = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,320,480)]; 
    [self.view addSubview:imageViewBottom]; 

    imageViewTop = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,320,480)]; 
    [self.view addSubview:imageViewTop]; 

    imageArray = [NSArray arrayWithObjects: 
        [UIImage imageNamed:@"lori.png"], 
        [UIImage imageNamed:@"miranda.png"], 
        [UIImage imageNamed:@"taylor.png"], 
        [UIImage imageNamed:@"ingrid.png"], 
        [UIImage imageNamed:@"kasey.png"], 
        [UIImage imageNamed:@"wreckers.png"], nil]; 


    NSTimer *timer = [NSTimer timerWithTimeInterval:5.0 
               target:self 
              selector:@selector(onTimer) 
              userInfo:nil 
              repeats:YES]; 

    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; 
    [timer fire]; 

    [super viewDidLoad]; 
} 

-(void)onTimer{ 
    if(topIndex %2 == 0){ 
     [UIView animateWithDuration:5.0 animations:^ 
     { 
      imageViewTop.alpha = 0.0; 
     }]; 
     imageViewTop.image = [imageArray objectAtIndex:prevTopIndex]; 
     imageViewBottom.image = [imageArray objectAtIndex:topIndex]; 
    }else{ 
     [UIView animateWithDuration:5.0 animations:^ 
     { 
      imageViewTop.alpha = 1.0; 
     }];  
     imageViewTop.image = [imageArray objectAtIndex:topIndex]; 
     imageViewBottom.image = [imageArray objectAtIndex:prevTopIndex]; 
    } 
    prevTopIndex = topIndex; 
    if(topIndex == [imageArray count]-1){ 
     topIndex = 0; 
    }else{ 
     topIndex++; 
    } 
} 
+0

@samanB: cappello di tizio spento .. lavorato bene ... ma la cosa è dopo il terzo immagine l'app si chiude..cud tu mi aiuti wid dis – kingston

+0

Puoi incollare lo stack delle chiamate e l'errore che si verifica quando si blocca. Senza di questo non c'è quasi nulla che io possa fare per aiutarti. – Sabobin

+0

samanB: c'è un errore o un arresto anomalo nella console ... sembra che mostri perfettamente le 3 immagini e poi si chiuda – kingston

3

Ecco cosa ha funzionato per me quando ho voluto animare una serie di messaggi come immagini per l'utente. Non importa quante immagini hai questo codice ruoterà attraverso di loro.

[self.messageBottom = [[UIImageView alloc] initWithFrame:CGRectMake(289, 262, 171, 38)]; 
[self addSubview:messageBottom]; 
[messageBottom setAlpha:0.0]; 
[messageBottom release]; 

self.messageTop = [[UIImageView alloc] initWithFrame:CGRectMake(289, 262, 171, 38)]; 
[self addSubview:messageTop]; 
[messageTop setAlpha:1.0]; 
[messageTop release]; 


self.messageImgsArray =[NSArray arrayWithObjects: 
         [UIImage imageNamed:@"image1.png"], 
         [UIImage imageNamed:@"image2.png"], 
         [UIImage imageNamed:@"image3.png"], 
         [UIImage imageNamed:@"image4.png"], 
         [UIImage imageNamed:@"image5.png"],nil]; 


topIndex = 0, bottomIndex = 1;  
[messageTop setImage:[messageImgsArray objectAtIndex:topIndex]]; 

//The timers time interval is the imageViews animation duration devided by the number of images in the animationImages array. 20/5 = 4 
NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 
             target:self 
             selector:@selector(onTimer) 
             userInfo:nil 
             repeats:YES]; 

[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; 

} 


-(void)onTimer{ 

    [UIView animateWithDuration:1 animations:^{ 

     //set the image of the image that is not currently visible 

     if (messageTop.alpha == 0) { 
      [messageTop setImage:[messageImgsArray objectAtIndex:topIndex]]; 
     } 
     if (messageBottom.alpha == 0) { 
      [messageBottom setImage:[messageImgsArray objectAtIndex:bottomIndex]]; 
     } 

     //make sure the images rotate 
     [messageTop setAlpha:messageTop.alpha == 0 ? 1 : 0]; 
     [messageBottom setAlpha:messageBottom.alpha == 0 ? 1 : 0]; 

     //make sure the images play in a loop 

     topIndex = topIndex < [messageImgsArray count]-1 ? bottomIndex+1 : 0; 
     bottomIndex = bottomIndex < [messageImgsArray count]-1 ? bottomIndex+1 : 0; 

    }]; 
} 
+0

come posso fermarlo dopo 3 volte? – iosMentalist

Problemi correlati