2014-09-19 12 views
7

Il mio punto è copiare il comportamento di molte app che utilizza foto in cui quando viene presentato UIScrollView con UIImageView all'interno si adatta all'immagine della dimensione dello schermo anche se questa immagine è più piccola.Impostazione della scala di zoom UIScrollView per adattarsi allo schermo

Sono sicuro che questo non dovrebbe essere fatto con il fotogramma UIImageView ma manipolato da UIScrollView ma come ...?


Nel mio codice ho un metodo chiamato updateZoom che calcola il valore minimumZoomScale e anche assegna questo valore alla proprietà zoomScale. Immagino che questo sia il posto giusto per fare matematica e calcolare zoomScale manualmente.

Questo è il metodo:

- (void)updateZoom { 
    float minZoom = MIN(self.view.bounds.size.width/self.imageView.image.size.width, self.view.bounds.size.height/self.imageView.image.size.height); 

    if (minZoom > 1) { 
     minZoom = 1; 
    } 

    self.scrollView.minimumZoomScale = minZoom; 
    self.scrollView.zoomScale = minZoom; 
} 

Spero che qualcuno mi desse un colpo su come impostare il zoomScale per adattarsi alle UIScrollView limiti.

risposta

2

impostare lo zoom, che si adatta alle dimensioni dell'immagine in ScrollView impostare il la minimumZoom per ScrollView utilizzare questo: self.scrollView.minimumZoomScale = self.scrollView.frame.size.width/ self.imageView.frame.size.width;

Sopra il codice si inserisce l'immagine in larghezza ScrollView.

5

La soluzione è stata abbastanza facile ... Dai un'occhiata a questo codice (versione modificata del metodo da OP):

- (void)updateZoom { 
    float zoomScale = MIN(self.view.bounds.size.width/self.imageView.image.size.width, self.view.bounds.size.height/self.imageView.image.size.height); 

    if (zoomScale > 1) { 
     self.scrollView.minimumZoomScale = 1; 
    } 

    self.scrollView.minimumZoomScale = zoomScale; 
    self.scrollView.zoomScale = zoomScale; 
} 

penso che ci sia nulla da spiegare come il codice è semplice.

10

Le soluzioni sopra funzionano, ma stavo faticando a capire perché. Mi piacerebbe condividere questi due articoli che ho trovato estremamente utile nell'impostare correttamente il mininumZoomScale e farlo funzionare con iOS8/XCode 6.

Innanzitutto, ottenere la vista di scorrimento per lavorare su iOS8 richiede di impostare correttamente i vincoli dall'inizio. Altri poster hanno raccomandato, e sono d'accordo, che la tua vista di scorrimento debba avere sempre una sola vista di contenuto. Bene per incorporare tutte le altre visualizzazioni all'interno della vista del contenuto, ma non si desidera impostare i vincoli della vista di scorrimento su un numero limitato di viste.

Collegare i limiti superiore, iniziale, finale e inferiore alla vista di scorrimento dalla vista del contenuto (nel mio caso si tratta di un UIImageView) con costante 0. Questo imposta i bordi della vista del contenuto sulla vista di scorrimento.

Quindi, impostare la dimensione della vista del contenuto utilizzando i vincoli di Larghezza uguale e Altezza uguale alla vista di scorrimento. Non è possibile utilizzare la larghezza fissa e l'altezza fissa nella vista del contenuto perché lo zoom non funziona, né è possibile gestire la dimensione da soli. Senza questi vincoli, iOS8 imposta la dimensione su (0,0) prima di avere la possibilità di produrre alcuni artefatti dispari. Con questi vincoli, chiama il metodo updateZoom nel metodo di orientamento e sei bravo. In iOS7 chiamalo in doneRotateFromInterfaceOrientation. In iOS8 chiamalo da viewWillTransitionToSize. Dovrai aggiornare il codice per passare nella nuova dimensione.

Molte grazie a Natasha Il robot per la soluzione vincolo: http://natashatherobot.com/ios-autolayout-scrollview/

Quando si chiama il metodo updateZoom per ottimizzare il vostro minimo, si dovrebbe anche verificare se lo zoomScale corrente è < tua minimumZoomScale e ripristinare se è. Non dovresti resettare lo zoomScale altrimenti questo diventa un altro aspetto interrogativo dal tuo utente quando cambia l'orientamento.

quanto riguarda il resto di esso e perché i lavori di matematica, Joe Conway a objc.io disposti tutto fuori in questo fantastico articolo su limiti vs telaio con UIScrollViews: http://www.objc.io/issue-3/scroll-view.html

Grazie a entrambi e del manifesto sopra .

-(void)updateZoom { 
    self.scrollView.minimumZoomScale = MIN(self.scrollView.bounds.size.width/self.imageView.image.size.width, self.scrollView.bounds.size.height/self.imageView.image.size.height); 

    if (self.scrollView.zoomScale < self.scrollView.minimumZoomScale) 
     self.scrollView.zoomScale = self.scrollView.minimumZoomScale; 
} 
0

E qui è la Swift 3 versione

var minZoom = min(self.view.bounds.size.width/theImage!.size.width, self.view.bounds.size.height/theImage!.size.height); 

     if (minZoom > 1.0) { 
      minZoom = 1.0; 
     } 

     self.scrollImg.minimumZoomScale = minZoom; 
     self.scrollImg.zoomScale = minZoom; 
1

SWIFT 3

Grazie a @chewy questo ha funzionato per me (avevo bisogno di aggiungere "limiti" per l'immagine):

func setZoomScale() { 

    var minZoom = min(self.view.bounds.size.width/imageView!.bounds.size.width, self.view.bounds.size.height/imageView!.bounds.size.height); 

    if (minZoom > 1.0) { 
     minZoom = 1.0; 
    } 

    scrollView.minimumZoomScale = minZoom; 
    scrollView.zoomScale = minZoom; 

} 

Quindi chiamare setZoomScale() in "override func viewWil lLayoutSubviews() "

Problemi correlati