Domanda

Ho un'istanza di UIScrollview contenente un'istanza di UIView. UIView è solo un contenitore per una matrice orizzontale di istanze UIImageView. - Lo zoom è fornito da UIScrollView e UIScrollViewDelegate. Vorrei costringere lo zoom a verificarsi solo lungo l'asse orizzontale senza alcuno scallamento verticale. Come posso farlo?

Esiste un modo, ad esempio, per sottoclassare UIView e sovrascrivere il metodo appropriato per impedire il ridimensionamento verticale? Mi piace questo approccio ma non sono chiaro su quale metodo sovrascrivere e cosa dovrebbe effettivamente fare quel metodo ignorato.

Saluti, Doug

È stato utile?

Soluzione

Simile a ciò che descrivo in questa risposta , puoi creare una sottoclasse UIView e sovrascrivere il metodo -setTransform: accessor per regolare la trasformazione che UIScrollView proverà ad applicare al tuo UIView. Imposta questo UIView per ospitare i tuoi sottoview dei contenuti e renderlo il sottoview di UIScrollView.

All'interno di -setTransform sovrascritto :, dovrai accettare la trasformazione che UIScrollView vorrebbe applicare e regolarlo in modo che il ridimensionamento abbia effetto solo in una direzione. Da documentazione su come sono costruite le matrici CGAffineTransform , credo che la seguente implementazione dovrebbe limitare il tuo ridimensionamento in modo che sia lungo la direzione orizzontale:

- (void)setTransform:(CGAffineTransform)newValue;
{
 CGAffineTransform constrainedTransform = CGAffineTransformIdentity;
 constrainedTransform.a = newValue.a;
 [super setTransform:constrainedTransform];
}

Altri suggerimenti

Utilizzando OS 3.0, è possibile indicare allo zoom di eseguire lo zoom su un rettangolo nella vista di scorrimento. Ho questo nella mia logica che rileva i tocchi.

CGRect zoomRect = [self zoomRectForScale:newScale withCenter:CGPointMake(tapPoint.x, tapPoint.y) inScrollView:scrollView];
[scrollView zoomToRect:zoomRect animated:YES];

Per l'altra parte, dovrai allungare le viste dell'immagine del rapporto che la nuova cornice ha rispetto all'originale e centrarla nello stesso punto centrale. Puoi farlo in un'animazione a tempo uguale all'animazione dello zoom in modo che appaia corretta, ma penso che questo sarà l'unico modo per farlo.

In scrollViewDidZoom: , regola le variabili della visualizzazione del contenuto in base a zoomScale , reimposta zoomScale su 1.0, quindi setNeedsDisplay nella visualizzazione dei contenuti. Gestisci lo zoom effettivo (nella direzione desiderata) in drawRect: .

I dettagli brutti:

  1. Mentre lo zoom è in corso, UIScollView cambia contentOffset e contentScale , quindi salva i valori precedenti in scrollViewWillBeginZooming: e in scrollViewDidZoom: in modo da poter calcolare te stesso un nuovo contentOffset in base allo zoom.

  2. Poiché la modifica di zoomScale genererà immediatamente un altro scrollViewDidZoom: , è necessario impostare un valore BOOL prima (e cancellare dopo) il ripristino del zoomScale . Prova BOOL all'inizio di scrollViewDidZoom: e ritorna se vero.

  3. Potrebbe essere necessario inibire scrollViewDidScroll: mentre lo zoom è in corso (testare un BOOL; impostarlo in scrollViewWillBeginZooming: e deselezionarlo in scrollViewDidEndZooming: ) in modo che i tuoi contenuti vengano utilizzati mentre lo zoom è in corso.

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