2010-06-01 15 views
21

Tengo UIScrollView con múltiples subvistas UIVIew. Me gustaría actualizar los datos que se muestran en cada UIView cuando aparecen en la parte visible de UIScrollView.viewWillAppear para las subvistas

¿Cuál es la devolución de llamada que se desencadena? Intenté viewWillAppear, pero parece que no se llama.

Gracias. :)

Respuesta

83

Tiene que hacer el cálculo usted mismo. Implementar scrollViewDidScroll: en la vista de desplazamiento delegado y calcular manualmente el que las opiniones son visibles (por ejemplo, comprobando si CGRectIntersectsRect(scrollView.bounds, subview.frame) vuelve verdadera

+0

bien, por alguna razón que tenía la impresión de que había una construida en devolución de llamada. Gracias. – nan

+0

¡Funciona como un amuleto, gracias! – jhilgert00

+0

De lo que puedo ver viewWillAppear: y sus parientes solo se llaman la primera vez que se agrega la vista a una jerarquía de vista. Incluso si se invoca el viewWillAppear de la supervista: los de cualquier subvista que ya esté en su jerarquía no lo serán. Por lo tanto, para ese caso simple necesita indicar a sus subvistas que actualicen desde cualquier vista raíz que reciba ese mensaje. –

3

Un ligero refinamiento que quería saber la cantidad de la vista que se muestra en el ScrollView:..

- (void)scrollViewDidScroll:(UIScrollView *)scrollView; 
{ 
    // Figure out how much of the self.userFeedbackView is displayed. 
    CGRect frame = CGRectIntersection(self.scrollView.bounds, self.userFeedbackView.frame); 
    CGFloat proportion = (frame.size.height*frame.size.width)/(self.userFeedbackView.frameWidth*self.userFeedbackView.frameHeight); 
    NSLog(@"%f; %@", proportion, NSStringFromCGRect(frame)); 
} 
5

respuestas anteriores son correctas si su ScrollView no está en el zoom de estado. en caso de que su ScrollView puede hacer zoom por encima de cálculo no funcionará como se debe tener en cuenta también el zoom

aquí está el código

CGRect visibleRect; 
       visibleRect.origin = self.mapScrollView.contentOffset; 
       visibleRect.size = self.mapScrollView.bounds.size; 

       float theScale = 1.0/self.mapScrollView.zoomScale; 
       visibleRect.origin.x *= theScale; 
       visibleRect.origin.y *= theScale; 
       visibleRect.size.width *= theScale; 
       visibleRect.size.height *= theScale; 
       if(CGRectIntersectsRect(visibleRect, btnPin.frame)){ 
         ... 
       } 
+0

Esto es genial! No me hubiera imaginado esto – csduarte

5

Swift 3 solución

func scrollViewDidScroll(_ scrollView: UIScrollView) { 
    let viewFrame = greenView.frame 

    let container = CGRect(x: scrollView.contentOffset.x, y: scrollView.contentOffset.y, width: scrollView.frame.size.width, height: scrollView.frame.size.height) 


    // We may have received messages while this tableview is offscreen 
    if (viewFrame.intersects(container)) { 
     // Do work here 
     print("view is visible") 
    } 
    else{ 
     print("nope view is not on the screen") 
    } 
} 
Cuestiones relacionadas