2009-04-05 9 views
14

Desidero implementare un comportamento di scorrimento personalizzato, riutilizzabile ed efficiente in un'applicazione per iPhone, quindi estendo UIScrollView con il mio controllo personalizzato e desidero monitorare i movimenti di scorrimento.Estensione di UIScrollView e monitoraggio degli eventi di scorrimento

Ora mi rendo conto che probabilmente potrei assegnare il mio controllo personalizzato come UIScrollViewDelegate e rispondere internamente per scrollViewDidScroll chiamate, ma questo non si sente corretto per me (potrei sbagliarmi).

Non sembra corretto in quanto il delegato è rivolto alla logica dell'interfaccia utente specifica dell'applicazione e i controlli dovrebbero essere di livello superiore. Significherebbe anche che avrei bisogno di inoltrare le chiamate delegate se una classe applicativa si è assegnata anche a un delegato, il che sembra inefficiente.

Come discendente diretto di UIScrollView mi aspetto di essere in grado di eseguire l'override del metodo che innesca la scrollViewDidScroll chiamata delegato, o avere accesso a un metodo template, o ascoltare fuori per gli eventi di scorrimento, ma io non riesco a vedere nessuna di queste opzioni.

Guardando il file UITableView.h, UITableView non sembra porsi come un UISCrollViewDelegate quindi mi chiedo come si gestisce questo (sto assumendo come si ricicla le cellule si deve tenere traccia la loro posizione rispetto ai limiti visibili).

Sono abbastanza nuovo in questa piattaforma in modo che possa mancare qualcosa di ovvio. Qualsiasi aiuto apprezzato.

+0

Hai mai trovato una buona soluzione? –

+0

Alla fine sono stato eseguito con l'implementazione di UIScrollViewDelegate e la doppia delega delle azioni UIScrollViewDelegate dal mio componente personalizzato. Penso che la risposta di Rob di seguito suoni lungo la strada giusta, ma è arrivato un po 'in ritardo per il lavoro che stavo facendo quindi non ho avuto la possibilità di esplorarlo purtroppo. –

risposta

17

Trovato!(Completamente per caso)

mi ero rassegnato a cedere il mio UIScrollView sottoclasse come delegato al super quindi implementare la scrollViewDidScroll: metodo delegato, tuttavia in parte attraverso l'attuazione ho ricevuto un'eccezione nel bel mezzo del mio metodo scrollViewDidScroll. . un rapido sguardo alla traccia dello stack mi ha mostrato che il mio metodo delegato è stato effettivamente chiamato dalla setContentOffset:

si scopre, se Override setContentOffset: si riceve una chiamata ogni volta che la vista di scorrimento si muove! e viene fornito con un pratico struct contentOffset di dirvi dove la vista di scorrimento è attualmente :)

- (void)setContentOffset:(CGPoint)contentOffset 
{ 
    [super setContentOffset:contentOffset]; 

    NSLog(@"ViewDidScroll: %f, %f", contentOffset.x, contentOffset.y); 
} 
+0

Fantastico, grazie! – BigCheesy

+0

Soluzione perfetta. Hai salvato la mia giornata :) Grazie – gstream79

0

(posso sbagliarmi)

Penso che tu sia. Senza comprendere i dettagli della tua app, i metodi dei delegati sembrano esattamente ciò che desideri. Ricordare che il controller (sottoclasse UIViewController) può anche essere il delegato della propria vista.

0

Penso che il relè delegato sia quello che vuoi. Ti permetterebbe di usare l'API pubblicata, che di solito è consigliata piuttosto che funzioni di override di cui non dovresti sapere nulla. Sono d'accordo che sembra più disordinato di quanto dovrebbe essere, ma se i ganci in UIScrollViewDelegate sono ciò che ti serve per le tue personalizzazioni, allora sembra che sia la soluzione migliore.

È inoltre possibile fornire il proprio oggetto/protocollo delegato personalizzato a qualsiasi UIViewController utilizza la vista di scorrimento per eseguire anche alcune regole di visualizzazione specifiche.

3

Sono d'accordo con la tua valutazione originale. Se stai modificando la logica di scorrimento (anziché rispondere allo scorrimento), allora questa è una sottoclasse, non un delegato.

UIScrollView è progettato per essere sottoclasse e include una piccola discussione su di esso nel riferimento. In particolare i suggerimenti prevalgono su -touchesShouldBegin:withEvent:inContent:, pagingEnabled e touchesShouldCancelInContentView:, che sono probabilmente dove si desidera eseguire il lavoro che si sta descrivendo.

-1

È possibile utilizzare il seguente protocollo per ascoltare scorrere posizione:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    NSLog(@"scroll"); 
} 

Vedi this link (documentazione di Apple su UIScrollViewDelegate).

Vedere anche this link (un po 'di codice per configurare il delegato).

2

In caso di dubbi, è consigliabile utilizzare i metodi delegati, tuttavia a volte (ho solo bisogno di farlo ora negli ultimi 5 anni di sviluppo di iOS) la sottoclasse è la strada da seguire.

La risposta di Jo-el è corretta per Obj-C. Eccolo in Swift:

class FeedScrollView: UIScrollView { 

    override var contentOffset: CGPoint { 
     willSet(newContentOffset) { 
      print("About to set Offset: \(newContentOffset)") 
     } 
    } 
} 
+0

Questo metodo viene eseguito una o più volte (continuamente finché scorre) per scorrimento? – sharshi

Problemi correlati