2009-09-18 9 views
5

Non riesco a trovare la risposta per questo problema che sto avendo.Center UIImageView all'interno di UIScrollView senza contentInset?

Ho un UIImageView all'interno di un UIScrollView e vorrei il centro del suo contenuto verticalmente.

In questo momento, l'unico modo in cui sono stato in grado di farlo è impostare contentInset della vista di scorrimento in base all'altezza della dimensione UIImageView, ma questa non è una soluzione perfetta; aumenta semplicemente le dimensioni di UIImageView, rendendo UIScrollView "pensa" che il suo contenuto sia più grande e aggiunge queste barre nere verso l'alto.

Ho cercato di ottenere aiuto da:

UIScrollView with centered UIImageView, like Photos app

e

Center content of UIScrollView when smaller

ma non sono stati in grado di risolverlo utilizzando quelle risposte.

+0

Inoltre sto lottando per trovare una soluzione per questo. Sembra che non ci sia un modo semplice per centrare il contenuto di una scrollView. – Jonah

+0

Ha già ricevuto una risposta? – JoePasq

risposta

1

Creare un UIView separato e aggiungere l'UIImageView centrato in questo, quindi aggiungere la vista del ScrollView

UIView *view = [[UIVIew alloc] initWithFrame:<frame that will fill your scrollview>]; 
CGRect frame = CGRectMake((view.size.width - IMAGE_WIDTH)/2, (view.size.height - IMAGE_HEIGHT)/2, IMAGE_WIDTH, IMAGE_HEIGHT); 
UIImageView *imageView = [[UIImageView alloc] initWithFrame:frame]; 
imageView.image = [UIImage imageNamed:@"imageSized_IMAGE_WIDTH_by_IMAGE_HEIGHT.png"]; 
[view addSubview:imageView]; 
[imageView release]; 

[scrollView addSubview:view]; 
[view release]; 

Nota che sarà necessario impostare il telaio al fine di essere le dimensioni e posizione che vi interessano nella ScrollView. La parte importante da notare è il centraggio della vista di immagini all'interno della cornice della vista utilizzando le dimensioni dei fotogrammi di vista come variabili.

+0

Funzionerà in qualche modo. Il problema è che se l'immagine è più piccola di UIView, scorrerà parzialmente fuori dallo schermo. L'app per le foto non lo consente e sembra molto più bello. – Jonah

+1

Sì, ho visto il problema di cui Jonah parla in alcune app. L'unica app che ho visto è stata in grado di fare ciò che vogliamo in modo appropriato è Photos.app di Apple :(Finora, sto solo centrando la mia immagine all'interno di un UIView che è quindi la dimensione dell'immagine + qualsiasi insetto ho bisogno di averlo essere centrato all'interno il UIScroolView. Non ottimale, dal momento che aggiunge barre nere nella parte superiore e inferiore. Sembra un po 'meglio se rimuovo le scrollbar (come Foto.app) – runmad

4

Si può dire al UIScrollView per scorrere fino a vista specifica chiamando scrollRectToVisible:animated:

Esempio:

[myScrollView scrollRectToVisible:imageView.frame animated:YES]; 

Per centrare verticalmente, provate questo:

1) Aggiungere una vista vuoto al vostro scrollview che è la stessa altezza del tuo contentSize.

2) Aggiungi la tua UIImageView al centro del emptyView

2) scrollRectToVisible su questo vuota vista.

+0

screenshot è rotto – Besi

0

contentInset non dovrebbe modificare il contenuto Dimensione, dovrebbe cambiare il contenutoOffset.

Provare a impostare contentSize, quindi contentInset. Guarda anche il colore di sfondo di UIScrollView e cosa potrebbe mostrare dietro di esso. Non ho problemi a centrare un UIImageView in un UIScrollView usando setContentSize, setContentInset e addSubview.

1

Apple ha rilasciato i video della sessione WWDC 2010 a tutti i membri del programma per sviluppatori iPhone.Uno degli argomenti trattati è come hanno creato l'app per le foto !!! Costruiscono un'app molto simile passo dopo passo e hanno reso tutto il codice disponibile gratuitamente.

Non utilizza nemmeno l'API privata. Non posso inserire alcun codice qui a causa dell'accordo di non divulgazione, ma qui c'è un collegamento al download del codice di esempio. Probabilmente dovrai effettuare il login per accedere.

http://connect.apple.com/cgi-bin/WebObjects/MemberSite.woa/wa/getSoftware?code=y&source=x&bundleID=20645

Ed, ecco un link alla pagina di iTunes WWDC:

http://insideapple.apple.com/redir/cbx-cgi.do?v=2&la=en&lc=&a=kGSol9sgPHP%2BtlWtLp%2BEP%2FnxnZarjWJglPBZRHd3oDbACudP51JNGS8KlsFgxZto9X%2BTsnqSbeUSWX0doe%2Fzv%2FN5XV55%2FomsyfRgFBysOnIVggO%2Fn2p%2BiweDK%2F%2FmsIXj

6

Questo codice dovrebbe funzionare sulla maggior parte delle versioni di iOS (ed è stato testato per funzionare su 3.1 verso l'alto, che è tutto ciò che attualmente ho accesso a).

Si basa sul codice Apple WWDC menzionato nella risposta di Giona.

Aggiungere il seguente per la vostra sottoclasse di UIScrollView, e sostituire tileContainerView con la vista contenente l'immagine o piastrelle:

- (void)layoutSubviews { 
    [super layoutSubviews]; 

    // center the image as it becomes smaller than the size of the screen 
    CGSize boundsSize = self.bounds.size; 
    CGRect frameToCenter = tileContainerView.frame; 

    // center horizontally 
    if (frameToCenter.size.width < boundsSize.width) 
     frameToCenter.origin.x = (boundsSize.width - frameToCenter.size.width)/2; 
    else 
     frameToCenter.origin.x = 0; 

    // center vertically 
    if (frameToCenter.size.height < boundsSize.height) 
     frameToCenter.origin.y = (boundsSize.height - frameToCenter.size.height)/2; 
    else 
     frameToCenter.origin.y = 0; 

    tileContainerView.frame = frameToCenter; 
} 
+0

Sto lavorando su un'app per iPad e volevo centrare l'immagine mostrato in DetailView. Non ho creato sottoclassi UIScrollView, ma ho aggiunto questo codice a shouldAutorotateToInterfaceOrientation e ora funziona bene sia in modalità orizzontale che verticale. Grazie per la condivisione. – Sushant

Problemi correlati