Domanda

NOTA:Ho aggiunto la mia nuova soluzione all'AGGIORNAMENTO di risposta qui sotto.

Cerco di ricreare gli effetti che abbiamo visto in Mobile Safari scheda su iPhone/iPod touch.

In pratica, è una UIScrollView che contiene 4 riutilizzabili UIView (che agisce come buffer circolare), e scorre in senso orizzontale.Durante lo scorrimento, la UIView opacità di dissolvenza in/out senza soluzione di continuità con la stampa offset.

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

E funziona, le prestazioni sono ok, tutto funziona senza problemi, ma l'unico problema è che troppi di calcolo.

Ho provato UIView s beginAnimations: e commitAnimations:, ma è inutile in scrollViewDidScroll:, dal 1) il nuovo valore di alpha sono ancora da calcolare da solo, e 2) scrollViewDidScroll:tenuto chiamato durante lo scorrimento, è privo di senso per fare l'animazione qui.C'è un modo per riscrivere questa parte Core Animation?Così non devo fare la matematica me su alpha valore di ogni UIView, invece, riesco a sinistra, il tutto a base di Animazione.

È stato utile?

Soluzione

AGGIORNAMENTO

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

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

In modo che ognuno 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 il mio contentViews può fare il calcolo e animate dagli stessi al momento di scorrimento:

- (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, sarà necessario rimuovere l'osservatore quando si rimuove il contenuto da superview, e aggiungere di nuovo quando il nuovo contenuto creato.

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

Altri suggerimenti

Come avrete notato, da come spesso scrollViewDidScroll:è chiamato, UIScrollView non è semplicemente un fuoco e dimenticare una base di Animazione di transizione:si sposta manualmente i limiti in base ai tocchi, accelerazione, etc.Non c'è alcun modo semplice per cambiare questo.

Tuttavia, se si viene sommersi da eventi di scorrimento, si potrebbe provare un trucco come il 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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top