2012-06-12 25 views
19

Ho un UIScrollView e voglio che sia in grado di scorrere in entrambe le direzioni (lo fa attualmente) ma solo uno alla volta. Quindi, ad esempio, se inizi a scorrerlo orizzontalmente, non si muoverà affatto verticalmente finché non lo lasci andare e inizi a spostarlo verticalmente. Come potrei andare a fare questo?UIScrollView che scorre in una sola direzione alla volta

risposta

51

Impostare la proprietà directionalLockEnabled su SÌ. Da documenti Apple:

Se questa proprietà è NO, lo scorrimento è consentito in entrambe le direzioni orizzontale e verticale. Se questa proprietà è SÌ e l'utente inizia a trascinare in una direzione generale (orizzontale o verticale), la vista di scorrimento disabilita lo scorrimento nell'altra direzione. Se la direzione di trascinamento è diagonale, lo scorrimento non sarà bloccato e l'utente può trascinare in qualsiasi direzione fino al completamento del trascinamento. Il valore predefinito è NO

+2

Eh, ho impostato che la proprietà in IB, ma non ha funzionato. Funzionava solo a livello di programmazione. Grazie! – Letrstotheprez

+0

Ho aggiunto questo: - (void) scrollViewDidEndDecelerating: (UIScrollView *) scrollView ha funzionato per me. E ha aggiunto: scrollView.directionalLockEnabled nella funzione. Quando ho letto questa risposta mi ci è voluto un po 'di tempo per capire cosa stavo aggiungendo directionLockEnabled e dove lo stavo aggiungendo –

4

La risposta accettata per questa domanda non è del tutto corretta. Secondo la documentazione corrente directionalLockEnabled (come citato nella risposta originale):

Se la direzione di trascinamento è diagonale, allora lo scorrimento non sarà bloccato e l'utente può trascinare in qualsiasi direzione fino a quando la resistenza completa.

Ho trovato questo il caso. Se la direzione iniziale del trascinamento è più vicina a un angolo di 45 gradi tra gli assi xey, il blocco direzionale fallisce. Se trascini più o meno orizzontalmente o verticalmente, il blocco si attiva.

Per Un modo per realizzare true bloccaggio uni-assiale, vedere il link: http://bogdanconstantinescu.com/blog/proper-direction-lock-for-uiscrollview.html

2

il modo più semplice per raggiungere questo obiettivo è impostato il directionalLockEnabled di YES ed attuare le delegato UIScrollerView simili

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    if (scrollView.contentOffset.x != 0 && 
     scrollView.contentOffset.y != 0) { 
     scrollView.contentOffset = CGPointMake(0, 0); 
    } 
} 
+0

Molto semplice e funziona molto bene. Grazie. –

0

Questo ha funzionato per me sulla base della risposta di @Joe xi. Swift 3,0

func scrollViewDidScroll(_ scrollView: UIScrollView) { 
    if scrollView.contentOffset.x != 0 && scrollView.contentOffset.y != 0 { 
     scrollView.contentOffset = CGPoint(x: 0, y: 0) 
    } 
} 
Problemi correlati