UIView. Come posso limitare il ridimensionamento a una sola dimensione
-
07-07-2019 - |
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
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:
-
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.
-
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.
-
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.