2011-09-05 14 views
5

Il mio UIScrollView è popolato con un grande contenuto e quindi ingrandito con "setZoomScale: animato", in modo che si adatti al frame della vista. La vista appare correttamente ingrandita e posizionata correttamente nella vista a scorrimento. Tuttavia, l'utente è in grado di scorrere all'esterno del contenuto (il colore dello sfondo della vista a scorrimento indica). Sembra che possa scorrere fino alla dimensione del contenuto originale (come se il contenuto non fosse stato ingrandito). Stranamente, dopo che l'utente ha effettuato lo zoom manualmente la prima volta, tutto funziona correttamente e la vista a scorrimento è nuovamente vincolata alla dimensione del contenuto.UIScrollView scorre troppo dopo lo zoom iniziale

Ho cercato sul Web e ho analizzato i documenti e gli esempi Apple, ma non ho trovato nessuno con lo stesso problema. Gli esempi Apple sembrano mostrare la stessa cosa che faccio io.

Il mio contenuto è una vista personalizzata derivata da UIView e il cui CALayer è sostituito da un CATiledLayer (come negli esempi di Apple). Il disegno faccio me stesso in drawLayer: inContext :.

Ecco un frammento di codice da MyScrollViewController:

- (void)loadView { 
    CGRect frame = [UIScreen mainScreen].applicationFrame; 
    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:frame]; 
    scrollView.maximumZoomScale=1.0; 
    scrollView.delegate = self; 

    ... setup theContentView ... 

    scrollView.contentSize = theContentView.bounds.size; 
    scrollView.contentInset = UIEdgeInsetsMake(20, 20, 20, 20); 
    [scrollView addSubview:theContentView]; 
    self.view = scrollView; 

    double zoomScale = 0.5; // hardcoded for testing 
    [scrollView setZoomScale:zoomScale animated:NO]; 
NSLog(@"zoomscale=%g contentview=%@ contentsize=%@", zoomScale, NSStringFromCGSize(theContentView.bounds.size), NSStringFromCGSize(scrollView.contentSize)); 

    [scrollView release]; 
} 

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 
{ 
    return theContentView; 
} 

La dichiarazione NSLog mostra un impostato correttamente contentSize e zoomscale ...

sperando che ci sia qualcosa di ovvio che mi manca ...

+0

Qualcuno aveva una soluzione per questo? Ho lo stesso problema, proprio il contrario. My Scrollview è troppo piccolo per visualizzare l'immagine contenuta (non riesco a scorrere fino alla fine dell'immagine). Ma dopo aver eseguito lo zoom una volta tutto è a posto. – Maverick1st

+1

Ho finito per impostare lo zoomScale sul successivo runloop (invece che direttamente da loadView), che ha funzionato: "[self performSelector: @selector (initialZoom) withObject: nil afterDelay: 0];". Ma ho anche riscritto molte altre cose, quindi non sono sicuro che sia l'unica cosa necessaria. – fishinear

+0

Alla fine ho avuto la stessa idea e funziona perfettamente. Un bonus che si ottiene, quando si imposta la scala di zoom in viewDidAppear, è che l'utente vede uno zoom animato e quindi sa che l'immagine che vede è zoomabile :) – Maverick1st

risposta

3

ho finito per l'impostazione del zoomScale sul prossimo runloop (invece che direttamente da loadview), che ha lavorato:

- (void) loadView { 
    CGRect frame = [UIScreen mainScreen].applicationFrame; 
    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:frame]; 
    scrollView.maximumZoomScale=1.0; 
    scrollView.delegate = self; 

    ... setup theContentView ... 

    scrollView.contentSize = theContentView.bounds.size; 
    scrollView.contentInset = UIEdgeInsetsMake(20, 20, 20, 20); 
    [scrollView addSubview:theContentView]; 
    self.view = scrollView; 

    // set the zoom level on the next runloop invocation 
    [self performSelector:@selector(initialZoom) withObject:nil afterDelay:0]; 

    [scrollView release]; 
} 

- (void) initialZoom { 
    double zoomScale = 0.5; // hardcoded for testing 
    UIScrollView *scrollView = (UIScrollView *) self.view; 
    [scrollView setZoomScale:zoomScale animated:NO]; 
} 

Un'altra possibilità, suggerita da Maverick1st, è quello di impostare lo zoomscale da viewDidAppear, piuttosto che loadview . Questo approccio ha l'ulteriore vantaggio di mostrare un'animazione dello zoom, indicando all'utente che la vista inizia in uno stato ingrandito.

- (void) viewDidAppear { 
    double zoomScale = 0.5; // hardcoded for testing 
    UIScrollView *scrollView = (UIScrollView *) self.view; 
    [scrollView setZoomScale:zoomScale animated:YES]; 
} 
1

Sono nuovo in questo, ma puoi provare a ritagliare le sottoview. Ho creato una vista di scorrimento con il generatore di interfacce, e lì nell'ispettore degli attributi c'era una sottoview di clip della casella di controllo, quindi penso che dovresti fare qualcosa del genere, solo a livello di programmazione. Spero possa aiutare.

Problemi correlati