Domanda

UIScrollView in modalità paging assume le pagine sono situati proprio accanto all'altro, senza gioco. Tuttavia, se si apre una foto nel app Foto e scorrere attraverso le foto, si può vedere che ha un po 'di spazio tra le pagine. Voglio che queste lacune troppo.

Sono alla ricerca di soluzioni esistenti, se del caso, o per qualche idea più bizzarri circa l'attuazione delle lacune pagina oltre a quello che ho spiegato qui di seguito. O forse c'è un modo semplice ovvio che mi manca?

Per essere chiari: io voglio il gap da solo sia visibile durante lo scorrimento, quindi non posso semplicemente inserto contenuto della pagina

.

Il mio piano è quello di provare a spostare il contenuto della pagina dall'interno scrollViewDidScroll richiamata, in modo che (supponendo che si sta scorrendo verso destra) inizialmente la pagina di destinazione è leggermente spostato verso destra dei suoi limiti di pagina, e per il momento si arriva alla pagina di destinazione è di nuovo nella sua posizione corretta, e la pagina di origine è leggermente spostato a sinistra dei suoi confini. (O forse invece di spostare le cose in modo continuo, sarò meglio spostando gli offset, diciamo, esattamente a metà strada tra le pagine.)

Sono l'autore del ScrollingMadness + esempio che sono stato riferendosi alcune persone a qui. Ho implementato zoom progammatic, ed ha ottenuto in-photo zoom + scorrimento lavorando insieme con l'Inter-foto di paging. Quindi so come giocare con UIScrollView, e sto cercando la roba avanzata.

Per favore non mi puntare a TTScrollView. Ho già fatto notare molte persone a me stesso, ma ritengo che è sentire troppo lontano dal comportamento UIScrollView nativa, e non vogliono usarlo nei miei progetti.

È stato utile?

Soluzione

  

Si noti che questa risposta è abbastanza vecchia. Il concetto di base, ma funziona ancora   non si dovrebbe essere la codifica difficile Visualizza dimensioni in iOS7 e 8. Anche se si ignora   quel consiglio, non si deve usare 480 o 330.

Hai provato facendo la cornice del UIScrollView leggermente più grande rispetto allo schermo (supponendo che si desidera visualizzare le immagini a schermo intero e quindi organizzare i tuoi subviews sui confini stesso leggermente più grandi del lo schermo.

#define kViewFrameWidth 330; // i.e. more than 320

CGRect scrollFrame;
scrollFrame.origin.x = 0;
scrollFrame.origin.y = 0; 
scrollFrame.size.width = kViewFrameWidth;
scrollFrame.size.height = 480;

UIScrollView* myScrollView = [[UIScrollView alloc] initWithFrame:scrollFrame];
myScrollView.bounces = YES;
myScrollView.pagingEnabled = YES;
myScrollView.backgroundColor = [UIColor redColor];

UIImage* leftImage = [UIImage imageNamed:@"ScrollTestImageL.png"];
UIImageView* leftView = [[UIImageView alloc] initWithImage:leftImage];
leftView.backgroundColor = [UIColor whiteColor];
leftView.frame = CGRectMake(0,0,320,480);

UIImage* rightImage = [UIImage imageNamed:@"ScrollTestImageR.png"];
UIImageView* rightView = [[UIImageView alloc] initWithImage:rightImage];
rightView.backgroundColor = [UIColor blackColor];
rightView.frame = CGRectMake(kViewFrameWidth * 2,0,320,480);

UIImage* centerImage = [UIImage imageNamed:@"ScrollTestImageC.png"];
UIImageView* centerView = [[UIImageView alloc] initWithImage:centerImage];
centerView.backgroundColor = [UIColor grayColor];
centerView.frame = CGRectMake(kViewFrameWidth,0,320,480);

[myScrollView addSubview:leftView];
[myScrollView addSubview:rightView];
[myScrollView addSubview:centerView];

[myScrollView setContentSize:CGSizeMake(kViewFrameWidth * 3, 480)];
[myScrollView setContentOffset:CGPointMake(kViewFrameWidth, 0)];

[leftView release];
[rightView release];
[centerView release];

scuse se questa non viene compilato, ho provato in un'applicazione paesaggio e la mano modificato di nuovo a ritratto. Sono sicuro che si ottiene l'idea però. Essa si basa sulla clipping superview, che per una visualizzazione a schermo intero sarà sempre il caso.

Altri suggerimenti

Quindi non ho abbastanza "rep" per inviare un commento per la risposta di cui sopra. La risposta è corretta, ma c'è un problema grande per essere a conoscenza di:

Se stai usando un UIScrollView in un viewController che fa parte di un UINavigationController, il controller di navigazione ridimensiona la struttura del vostro ScrollView.

Questo è, si dispone di un'applicazione che utilizza un'UINavigationController per passare da una vista. Si preme un viewController che ha uno ScrollView e si crea questo ScrollView nel metodo init del viewController. Si assegna un telaio di (0, 0, 340, 480).

Ora, passare al metodo -viewDidAppear del viewController, ottenere la cornice del ScrollView si è creato. Troverete che la larghezza è stata ridotta a 320 pixel. In quanto tale, il paging non funziona correttamente. Ti aspetta lo ScrollView per spostare 340 pixel ma sarà, invece, spostare 320.

UINavigationController è un po 'noto per fare scherzi con subviews. E 'li muove e li ridimensiona per accogliere la barra di navigazione. In breve, non è un gioco di squadra - soprattutto in questo caso. Altri posti sul web suggeriscono di non utilizzare UINavigationController se avete bisogno di un controllo preciso su dimensioni e posizioni le vostre opinioni. Essi suggeriscono che, invece, si crea la propria classe navigationController sulla base di UINavigationBar.

Beh questo è un sacco di lavoro. Fortunatamente, c'è una soluzione più semplice: impostare la cornice del ScrollView nel metodo di -viewDidAppear del viewController. A questo punto, UINavigationController è fatto scherzi con il telaio, in modo da poter ripristinare a quello che dovrebbe essere e lo ScrollView si comporterà correttamente.

Questa è rilevante per OS 3.0. Non ho ancora testato 3.1 o 2.2.1. Ho anche presentato un bug report con Apple suggerendo che modificano UINavigationController con un BOOL come "-shouldAutoarrangeSubviews", in modo che si possa fare quella classe a mantenere le sue mani sporche fuori subviews.

Fino a che arriva, la correzione di cui sopra vi darà le lacune in un'UIScrollView impaginata all'interno di un UINavigationController.

Apple ha rilasciato il video di sessione WWDC 2010 a tutti i membri del iPhone Developer Program. Uno dei temi discussi è come hanno creato la foto app !!! Costruiscono un passo applicazione molto simile passo e hanno fatto tutto il codice a disposizione gratuitamente.

Non usa api privato sia. Questo è il link per il codice di esempio download. Sarà probabilmente necessario eseguire il login per ottenere l'accesso.

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

E, 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

Il modo per farlo è come hai detto tu, una combinazione di un paio di cose.

Se si desidera uno spazio di 20px tra le immagini, è necessario:

In primo luogo, espandere la larghezza totale del tuo vista di scorrimento da 20px e spostarlo a sinistra da 10px.

In secondo luogo, quando si stabiliscono le xloc delle immagini, aggiungere 20px per ciascuna immagine in modo che siano distanziati 20px a parte. In terzo luogo, impostare il xloc iniziale di immagini a 10px invece di 0px.

In quarto luogo, assicurarsi di impostare la dimensione contenuto del tuo vista di scorrimento per aggiungere 20px per ogni immagine. Quindi, se avete kNumImages immagini e ciascuno è kScrollObjWidth, poi si va in questo modo:

[scrollView setContentSize:CGSizeMake((kNumImages * (kScrollObjWidth+20)),  kScrollObjHeight)];

Dovrebbe funzionare dopo che!

Questa è solo una sensazione, così scuse se completamente sbagliato, ma è possibile che il contentSize è solo impostato leggermente più ampia rispetto alla larghezza dello schermo.

Le informazioni corrette viene poi emessa entro la vista alla larghezza dello schermo e UIScrollView si prende cura di tutto il resto?

Forse volete provare proprietà contentInset di UIScrollView?

myScrollView.contentInset = UIEdgeInsetsMake(0, 0, 0, 10.0);

Ho solo pensato che vorrei aggiungere qui per i posteri la soluzione che ho finito per andare con. Per molto tempo ho utilizzato la soluzione di Bryan di regolazione del telaio in -viewDidAppear, e questo ha funzionato brillantemente. Tuttavia dal momento che iOS ha introdotto il multitasking Sono stato in esecuzione in un problema in cui il frame vista di scorrimento viene cambiato quando l'applicazione riprende dallo sfondo. In questo caso, <=> non veniva chiamato e non riuscivo a trovare un metodo delegato che sarebbe stato chiamato al momento giusto per invertire la modifica. Così ho deciso di fare la mia scorrimento visualizzare una visualizzazione secondaria di vista il mio controller di vista, e questo sembrava per risolvere il problema. Questo ha anche il vantaggio di non dover utilizzare <=> per cambiare il telaio - si può fare subito dopo aver creato la vista di scorrimento. La mia domanda qui ha i dettagli, ma io li posterò anche qui:

CGRect frame = CGRectMake(0, 0, 320, 460);
scrollView = [[UIScrollView alloc] initWithFrame:frame];

// I do some things with frame here

CGRect f = scrollView.frame;
f.size.width += PADDING; // PADDING is defined as 20 elsewhere
scrollView.frame = f;

[self.view addSubview:scrollView];

Per evitare scherzi con cornice di UIScrollView, si potrebbe creare una sottoclasse UIScrollView e sovrascrivere layoutSubviews di applicare un offset a ciascuna pagina.

L'idea si basa sulle seguenti osservazioni:

  1. Quando zoomScale! = 1, l'offset è zero quando è sul bordo sinistro / destro
  2. Quando zoomScale == 1, l'offset è zero quando è al centro rect visibile

Poi il seguente codice è derivato:

- (void) layoutSubviews
{
    [super layoutSubviews];

    // Find a reference point to calculate the offset:
    CGRect bounds = self.bounds;
    CGFloat pageGap = 8.f;
    CGSize pageSize = bounds.size;
    CGFloat pageWidth = pageSize.width;
    CGFloat halfPageWidth = pageWidth / 2.f;
    CGFloat scale = self.zoomScale;
    CGRect visibleRect = CGRectMake(bounds.origin.x / scale, bounds.origin.y / scale, bounds.size.width / scale, bounds.size.height / scale);
    CGFloat totalWidth = [self contentSize].width / scale;
    CGFloat scrollWidth = totalWidth - visibleRect.size.width;
    CGFloat scrollX = CGRectGetMidX(visibleRect) - visibleRect.size.width / 2.f;
    CGFloat scrollPercentage = scrollX / scrollWidth;
    CGFloat referencePoint = (totalWidth - pageWidth) * scrollPercentage + halfPageWidth;

    // (use your own way to get all visible pages, each page is assumed to be inside a common container)
    NSArray * visiblePages = [self visiblePages];

    // Layout each visible page:
    for (UIView * view in visiblePages)
    {
        NSInteger pageIndex = [self pageIndexForView:view]; // (use your own way to get the page index)

        // make a gap between pages
        CGFloat actualPageCenter = pageWidth * pageIndex + halfPageWidth;
        CGFloat distanceFromRefPoint = actualPageCenter - referencePoint;
        CGFloat numOfPageFromRefPoint = distanceFromRefPoint / pageWidth;
        CGFloat offset = numOfPageFromRefPoint * pageGap;
        CGFloat pageLeft = actualPageCenter - halfPageWidth + offset;

        view.frame = CGRectMake(pageLeft, 0.f, pageSize.width, pageSize.height);
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top