2013-04-10 7 views
6

Sono su un progetto che crea un numero personalizzato 'Move and Scale' Controller di UIImagePickerController. (controller quando appare se imagePickerController.allowsEditing=YES)Come posso regolare dinamicadocumentiInset in scrollViewDidZoom? Inizialmente ho impostato contentInset di UIImageView in UIScrollview

Voglio crop an UIImage nel ritaglio rettangolare come nella foto qui sotto.

screenshot 1

E ho fatto un po 'di codice per impostare contentInset.

self.selectedImageView.backgroundColor = [UIColor redColor]; 

    CGRect cropRect = [SKPhotoCropFrameView getCropRectFromOrientation:self.photoCropOrientation]; 
    CGRect aspectFitRect = AVMakeRectWithAspectRatioInsideRect(self.selectedImageView.image.size, self.selectedImageView.frame); 
    CGFloat difference = fabsf(cropRect.size.height - aspectFitRect.size.height); 
    self.contentInset = UIEdgeInsetsMake(difference/2, 0, difference/2 + 20, 0); // 20 is status bar height 

ed ecco il risultato.

screenshot 2

nera regione è zona contentInset.

Tuttavia, se pizzico questo scrollView per ingrandire, succede qualcosa.

screenshot 3

penso che devo fare qualcosa sul

- (void)scrollViewDidZoom:(UIScrollView *)scrollView 

per regolare contentInset dinamicamente. Come posso fare questo? Per favore, dammi un aiuto :)

+1

Non proprio una risposta alla tua domanda, ma il tuo approccio è diverso da quello di Apple e questo è il problema. Non consentono lo scorrimento verso il basso quando l'immagine è completamente rimpicciolita, non puoi semplicemente ingrandire la parte superiore di un'immagine quando usi il gesto di pizzicare. Dovrai o modificare il tuo approccio a quello che Apple utilizza e limitare l'area di zoom o utilizzare alcuni elementi dell'interfaccia utente per eseguire lo zoom a livello di codice, in questo modo avrai il controllo completo sull'area che stai ingrandendo. – Eugene

+0

@Eugene Grazie per il tuo commento. Penso che il mio approccio sia esattamente lo stesso di quello di Apple. Imomatico il UIImagePickerController di default. Voglio solo implementare il controller UIImagePickerController 'Move and Scale'. Vuoi spiegare perché questo è diverso da quello di Apple più sofisticato? –

risposta

3

Speravo che qualcuno rispondesse a questa domanda, sono triste perché non lo è.

Ma grazie a Dio, ho risolto questo.

in

- (void)scrollViewDidZoom:(UIScrollView *)scrollView 

regolare contentInset utilizzando dinamicamente zoomScale. Implemento solo lo Lanscape mode per i test, ma lo Portrait mode è esattamente allo stesso modo.

// adjust contentInset 
CGFloat increasingZoomScale = (scrollView.zoomScale == 1) ? 0 : (-1 * (1 - scrollView.zoomScale)); 

CGRect cropRect = [SKPhotoCropFrameView getCropRectFromOrientation:self.photoCropOrientation]; 
CGRect aspectFitRect = AVMakeRectWithAspectRatioInsideRect(self.selectedImageView.image.size, self.selectedImageView.frame); 
CGFloat difference = fabsf(cropRect.size.height - aspectFitRect.size.height); 

// implement at `Landscape` mode first 
if (self.photoCropOrientation == SKPhotoCropOrientationPortrait) { 

}else{ 
    // get scaledFrameHeight because it's `Landscape` crop mode 
    CGFloat increasingFrameHeight = scrollView.frame.size.height * increasingZoomScale; 
    self.contentInset = UIEdgeInsetsMake(difference/2 - increasingFrameHeight/2, 0, difference/2 - increasingFrameHeight/2, 0); 
} 

E bam. ecco lo screenshot.

screenshot 4