2009-05-17 13 views
13

NOTA: Ho aggiunto la mia nuova soluzione alla seguente risposta UPDATE.Dissolvenza in entrata/uscita Contenuto di UIScrollView come Mobile Safari nella sua scheda

Provo a ricreare gli effetti che abbiamo visto nella scheda di Mobile Safari su iPhone/iPod touch.

Fondamentalmente, è un UIScrollView che contiene 4 UIView riutilizzabili (che agisce come un buffer circolare) e scorre in orizzontale. Durante lo scorrimento, l'opacità di UIView si dissolvenza in apertura/uscita senza interruzioni.

Attualmente, faccio tutto il lavoro sporco in - (void)scrollViewDidScroll:(UIScrollView *)scrollView. Come ottenere contentOffset da UIScrollView, determinare il pageingation, calcolare il delta tra contentOffset e ciascuna posizione di UIView e decidere/impostare il valore alfa di ogni UIView nel momento in cui è stato chiamato scrollViewDidScroll:.

E funziona, le prestazioni sono a posto, tutto funziona senza intoppi, ma l'unico problema è troppo calcolo.

ho cercato di beginAnimations: e commitAnimations:, ma è inutile in scrollViewDidScroll:, dal momento che 1) il nuovo valore alfa devono ancora essere il calcolo da me, e 2) scrollViewDidScroll UIView: tenuto chiamato durante lo scorrimento, è priva di significato per fare l'animazione qui. C'è un modo per riscrivere questa parte con Core Animation? Quindi non devo fare la matematica io stesso sul valore alfa di ogni UIView, invece, posso lasciare intere opere a Core Animation.

risposta

26

UPDATE

mi si avvicinò con un altro modo per aggiornare il valore alfa di ogni pagina. Durante la creazione di vista dei contenuti, io uso KVO a addObserver con contentOffset di UIScrollView:

[self.scrollView addObserver:[self.contentViews objectAtIndex:i] 
        forKeyPath:@"contentOffset" 
        options:NSKeyValueObservingOptionNew 
        context:@selector(updateAlpha:)]; 

In modo che ciascuno dei miei contentViews otterrà il messaggio quando contentOffset cambiato:

- (void)observeValueForKeyPath:(NSString *)keyPath 
         ofObject:(id)object 
         change:(NSDictionary *)change 
         context:(void *)context { 
    [self performSelector:(SEL)context withObject:change]; 
} 

E i miei contentViews può fare il calcolo e animare da soli quando si scorre:

- (void)updateAlpha:(NSDictionary *)change { 
    CGFloat offset = [[change objectForKey:NSKeyValueChangeNewKey] CGPointValue].x; 
    CGFloat origin = [self frame].origin.x; 
    CGFloat delta = fabs(origin - offset); 

    [UIView beginAnimations:@"Fading" context:nil]; 
    if (delta < [self frame].size.width) { 
     self.alpha = 1 - delta/self.frame.size.width*0.7; 
    } else { 
     self.alpha = 0.3; 
    } 
    [UIView commitAnimations]; 
} 

Naturalmente, è necessario rimuovere l'osservatore quando si rimuove la vista dei contenuti da superview, e aggiungili di nuovo quando viene creata una nuova vista del contenuto.

Spero che questo aiuto per coloro che vogliono fare lo stesso.

+1

Solo trovandolo ora, ed è fantastico - grazie per averlo condiviso! Un problema tecnico: l'alfa iniziale non è impostato per la visualizzazione a schermo singolo. Suppongo che potrei chiamare updateAlpha: esplicitamente, ma forse è sufficiente impostare contentOffset in modo esplicito all'inizio. Pensieri? –

2

Come avrete notato da quanto spesso scrollViewDidScroll: è chiamato, UIScrollView non si limita a fuoco e dimenticare una transizione Core Animation: si muove manualmente i limiti in base al tocco, l'accelerazione, ecc Non c'è modo semplice per cambiare Questo.

Tuttavia, se sei stato sommerso dagli eventi di scorrimento, si potrebbe provare un trucco simile al seguente:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    NSTimeInterval timestamp = [[NSDate date] timeIntervalSince1970]; 
    if (timestamp - _savedTimestamp) < 0.1) 
     return; 
    _savedTimestamp = timestamp; 

    // do the rest of your work here 
} 

H

+0

hatfinch, grazie per l'idea. Anche se non è perfetto, conserva ancora un po 'di potenza della CPU. – digdog

Problemi correlati