tutorial page control cocoa-touch uiview uiscrollview

cocoa touch - page - ¿Cómo puedo recibir una notificación cuando un UIView se vuelve visible?



uipageviewcontroller (4)

He logrado resolver el problema de esta manera:

Primero, agregue una categoría para UIView con el siguiente método:

// retrieve an array containing all super views -(NSArray *)getAllSuperviews { NSMutableArray *superviews = [[NSMutableArray alloc] init]; if(self.superview == nil) return nil; [superviews addObject:self.superview]; [superviews addObjectsFromArray:[self.superview getAllSuperviews]]; return superviews; }

Luego, en su Vista, verifique si la propiedad de ventana está establecida:

-(void)didMoveToWindow { if(self.window != nil) [self observeSuperviewsOnOffsetChange]; else [self removeAsSuperviewObserver]; }

Si está configurado, observaremos el "contentOffset" de cada supervisión en cualquier cambio. Si la ventana es nula, dejaremos de observar. Puede cambiar el keyPath a cualquier otra propiedad, tal vez "marco" si no hay UIScrollView en sus supervisiones:

-(void)observeSuperviewsOnOffsetChange { NSArray *superviews = [self getAllSuperviews]; for (UIView *superview in superviews) { if([superview respondsToSelector:@selector(contentOffset)]) [superview addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil]; } } -(void)removeAsSuperviewObserver { NSArray *superviews = [self getAllSuperviews]; for (UIView *superview in superviews) { @try { [superview removeObserver:self forKeyPath:@"contentOffset"]; } @catch(id exception) { } } }

Ahora implemente el método "observeValueForKeyPath":

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if([keyPath isEqualToString:@"contentOffset"]) { [self checkIfFrameIsVisible]; } }

Finalmente, compruebe si el marco de la vista es visible dentro del marco de la ventana:

-(void)checkIfFrameIsVisible { CGRect myFrameToWindow = [self.window convertRect:self.frame fromView:self]; if(myFrameToWindow.size.width == 0 || myFrameToWindow.size.height == 0) return; if(CGRectContainsRect(self.window.frame, myFrameToWindow)) { // We are visible, do stuff now } }

¿Hay alguna forma de obtener una notificación, devolución de llamada o algún otro medio para llamar a un método cada vez que una UIView sea visible para el usuario, es decir, cuando una UIScrollview es la supervisión de algunas UIViews, y el ViewController de dicha UIView recibirá una notificación cuando ¿Su vista ahora es visible para el usuario?

Soy consciente de la posible, pero no tan elegante solución de verificar en qué posición se desplazó ScrollView (a través de los métodos UIScrollViewDelegate) y calcular si alguna de las subvistas es visible ...
Pero estoy buscando una manera más universal de hacer esto.


La propiedad de la capa de la vista debería decirnos si esa vista es visible o no.

[view.layer visibleRect];

Pero esto no funciona para mí.

Entonces, la solución podría ser utilizar la propiedad contentOffset de UiScrollView para calcular si una vista en particular está visible o no.


No creo que haya una manera universal de hacer esto para las vistas. Parece que estás atascado con scrollViewDidEndScrolling y otros métodos ScrollViewDelegate. Pero no estoy seguro de por qué dices que es elegante, son bastante sencillos.


Si su vista muestra un comportamiento, debe estar dentro de un controlador de vista. En un controlador de vista, el método viewDidAppear se llamará cada vez que aparezca la vista.

- (void)viewDidAppear:(BOOL)animated