2009-04-05 11 views
14

Estoy queriendo implementar un comportamiento de desplazamiento personalizado, reutilizable y eficiente en una aplicación de iPhone, por lo que extiendo UIScrollView con mi control personalizado y deseo realizar un seguimiento de los movimientos de desplazamiento.Extender UIScrollView y supervisar eventos de desplazamiento

Ahora estoy consciente de que probablemente podría asignar mi control personalizado como UIScrollViewDelegate y responder internamente para scrollViewDidScroll llamadas, pero esto no se siente correcto para mí (puedo estar equivocado).

No parece correcto ya que el delegado está dirigido a la lógica de la IU específica de la aplicación y los controles deben estar a un nivel superior. También significaría que necesitaría retransmitir las llamadas de delegado si una clase de aplicación también se asigna como delegado, lo que parece ineficaz.

Como descendiente directo de UIScrollView yo esperaría que ser capaz de anular el método que hace posible scrollViewDidScroll llamada delegado, o tener acceso a un método de la plantilla, o escuchar a cabo para los eventos de desplazamiento, pero no puede ver ninguna de esas opciones

Mirando el archivo UITableView.h, UITableView no parece erigirse como UISCrollViewDelegate por lo que me pregunto cómo se maneja esto (estoy suponiendo ya que recicla las células se debe realizar un seguimiento su posición relativa a los límites visibles).

Soy bastante nuevo en esta plataforma, así que me puede estar perdiendo algo obvio. Cualquier ayuda apreciada.

+0

¿Alguna vez encontró una buena solución? –

+0

Ejecuté con la implementación de UIScrollViewDelegate al final y delegué dos veces las acciones UIScrollViewDelegate de mi componente personalizado. Creo que la respuesta de Rob a continuación suena en el camino correcto, pero llegó un poco tarde para el trabajo que estaba haciendo, así que no tuve la oportunidad de explorarlo desafortunadamente. –

Respuesta

17

¡Lo encontraste!(Completamente por accidente)

me había resignado a ceder mi subclase UIScrollView como delegado al súper a continuación, aplicar el scrollViewDidScroll: Método delegado, sin embargo, forma parte a través de la implementación Tengo una excepción en medio de mi método scrollViewDidScroll. . una mirada rápida a la traza de la pila me mostró que mi método delegado en realidad estaba siendo llamado desde el setContentOffset:

resulta que, si anulación setContentOffset: recibe una llamada cada vez que la vista de desplazamiento se mueve! y viene con una estructura contentOffset útil para decirle donde actualmente es la vista de desplazamiento :)

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

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

¡Increíble, gracias! – BigCheesy

+0

Solución perfecta. Me salvaste el día :) Gracias – gstream79

0

(puedo estar equivocado)

Creo que eres. Sin entender los detalles de su aplicación, los métodos delegados suenan exactamente como usted quiere. Tenga en cuenta que el controlador (subclase UIViewController) también puede ser el delegado de su vista.

0

Creo que el relevo de delegados es lo que desea. Te permitiría usar la API publicada, que generalmente se recomienda en lugar de reemplazar las funciones de las que realmente no debes saber. Estoy de acuerdo en que parece más desordenado de lo que debería ser, pero si los ganchos en UIScrollViewDelegate son lo que necesita para sus personalizaciones, entonces parece que esa es su mejor apuesta.

También puede proporcionar su propio objeto/protocolo de delegado a cualquier UIViewController que esté utilizando su vista de desplazamiento para hacer algo de lógica específica de la vista también.

3

Estoy de acuerdo con su evaluación original. Si está cambiando la lógica de desplazamiento en sí (en lugar de responder al desplazamiento) entonces esa es una subclase, no un delegado.

UIScrollView está diseñado para ser subclasificado e incluye una pequeña discusión al respecto en la referencia. En particular, sugiere omitir -touchesShouldBegin:withEvent:inContent:, pagingEnabled y touchesShouldCancelInContentView:, que es probablemente donde desea hacer el trabajo que está describiendo.

-1

Puede utilizar el siguiente protocolo para escuchar la posición de desplazamiento:

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

Ver this link (docs de Apple en UIScrollViewDelegate).

Consulte this link también (algunos códigos para configurar el delegado).

2

En caso de duda, definitivamente debe optar por los métodos de delegado, sin embargo, algunas veces (solo he tenido que hacerlo ahora en los últimos 5 años del desarrollador iOS) la subclasificación es el camino a seguir.

La respuesta de Jo-el es correcta para Obj-C. Aquí está en Swift:

class FeedScrollView: UIScrollView { 

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

¿Se ejecuta este método una o varias veces (continuamente mientras se desplaza) por desplazamiento? – sharshi

Cuestiones relacionadas