2011-03-07 14 views
5

Sto usando uno zoom UIScrollView per mostrare le immagini nella mia app per iPad. Lo zoom funziona alla grande, con un pizzico che rende l'immagine più piccola o più grande, a seconda dei casi. Ho anche abilitato il bouncesZoom in modo che rimbalzi allo zoom minimo o massimo se l'utente lo allunga troppo in un modo o nell'altro.Come posso cancellare un rimbalzo dello zoom UIScrollView?

Ora mi piacerebbe riconoscere quando un pizzico si è concluso con l'immagine del 10% più piccola della dimensione minima dello zoom e, in tal caso, evitare il rimbalzo e attivare un'animazione diversa che riduce l'immagine a " chiudilo. In questo modo, può esserci una sorta di gesto "pizzica per chiudere". Quello che mi è venuta in mente per fare questo, nella sua più semplice, è questo:

- (void)scrollViewDidZoom:(UIScrollView *)scrollView { 
    if (self.zoomBouncing && zoomedToScale/self.minimumZoomScale < 0.90) { 
     // We've let go and were under 90% of the minimum size. 
     self.minimumZoomScale = zoomedToScale; 
     [self shrinkImageToNothing]; 
    } else { 
     // How far have we gone? 
     zoomedToScale = self.zoomScale; 
    } 
} 

Questa grande opera, tranne che a questo punto è già rimbalza, quindi l'impostazione di minimumZoomScale non fa nulla. Pertanto, il rimbalzo e lo restringimento si verificano nello stesso momento, il che, come puoi immaginare, sembra piuttosto strano.

Quindi la mia domanda è: come posso evitare che il rimbalzo si verifichi solo in questa specifica situazione? Non esiste un metodo UIScrollViewDelegate che permetta al mio codice di fare qualcosa tra quando il gesto finisce e quando UIScrollView decide di riprendersi. Ho provato un sacco di altre tecniche senza fortuna, tra cui:

  • Tornando nil da –viewForZoomingInScrollView: quando è passata la mia soglia di zoom 90%. Non funziona perché questo metodo viene chiamato all'avvio del gesto, non per ogni punto dello zoom.
  • L'impostazione in -scrollViewDidZoom: su falso quando il fattore di zoom è inferiore a 90% e su true quando è maggiore o uguale a 90%. Rende l'immagine tremolante quando la scala scende al di sotto del 90% perché non consente quella dimensione quando lo bouncesZoom è falso.
  • Aggiunta di un metodo -touchesEnded:withEvent. Non viene mai chiamato.
  • Aggiunta del mio UIPinchGestureRecognizer da eseguire contemporaneamente al riconoscimento pinch di UIScrollView. Non funziona perché i suoi gestori (e metodi delegati) sono chiamati dopo il il gesto di pizzicamento di UIScrollView, che rende la decisione di rimbalzare prima che il mio gesto possa dirlo non troppo. Ho provato a rimuovere tutti i gesti principali, aggiungendo il mio e aggiungendo i gesti principali. Ma il mio gesto era ancora chiamato chiamato dopo che UIScrollView aveva deciso che stava saltando.

Quindi sono un po 'una perdita. Qualcun altro ha provato a fare qualcosa di simile?

risposta

3

Immagino che scrivere questa domanda mi abbia aiutato a mettermi sulla strada per trovare la soluzione. E per fortuna, è abbastanza facile! Quindi, il primo passo, nel codice che ho che imposta minimumZoomScale, ho anche impostato un ivar cachedMinZoomScale allo stesso valore. Con questo, ricevendo il rimbalzo non accada quando la scala è inferiore al 90% del minimo è in realtà abbastanza straight-forward:

- (void)scrollViewDidZoom:(UIScrollView *)scrollView { 
    if (self.zoomScale/cachedMinZoomScale < 0.90) { 
     self.minimumZoomScale = self.zoomScale; 
    } else { 
     self.minimumZoomScale = cachedMinZoomScale; 
    } 
} 

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale { 
    if (self.zoomScale/cachedMinZoomScale < 0.90) { 
     [self shrinkImageToNothing]; 
    } 
} 

In sostanza, quando la vista di scorrimento zoom, mantenere il -self.minimumZoomScale alla scala di zoom corrente se è inferiore al 90% del minimo effettivo, ma impostarlo su quel minimo effettivo su qualsiasi altra scala di zoom. Quindi, quando lo zoom termina, se siamo sotto la soglia del 90%, non tornerà a nulla perché sarà già la dimensione minima, quindi chiamerà la nuova animazione per restringere per chiudere.

Semplice. Accidenti!

+2

Cosa sta facendo shrinkImageToNothing e dove viene impostato cachedMinZoomScale? – jjxtra

-2

Prova questo, [imageScrollview setBounces: NO];

+0

L'ho abilitato per altri motivi, come descritto nella domanda. La risposta accettata risponde al bisogno che ho avuto. – theory

7

Devi semplicemente impostare questa proprietà su NO. (ad esempio in ViewDidLoad)

scrollView.bouncesZoom = NO;

Problemi correlati