detectar cambios en el contenido de la vista de desplazamiento de UIWebView.

Estoy tratando de establecer una UIView en la parte inferior del contenido de un UIScrollView, así que establezco la position de la vista en el alto de contorno de la vista de la pantalla. Pero mi scrollview es una subview de un UIWebView, así que cuando las imágenes se cargan, el contenido se cambia y la vista que debería estar en la parte inferior de la window de desplazamiento termina en el medio …

Así que estoy buscando una forma de ser notificado cuando cambie el contenido de scrollview. He intentado subclamarlo y cambiar el setter para que continúen para enviar una NSNotification:

@implementation UIScrollView (Height) -(void)setContentSize:(CGSize)contentSize { _contentSize=contentSize; [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:@"scrollViewContentSizeChanged" object:nil]]; } @end 

Pero en compilation obtengo y error diciendo:

"_OBJC_IVAR _ $ _UIScrollView._contentSize", referencedo de: – [UIScrollView (Alto) setContentSize:] en MyClass.o ld: símbolo (s) no encontrado para la architecture armv7

¿Alguna idea de cómo se debe subclass el setter?

Gracias !

    Tal vez pueda usar la observación de valores key (KVO) para detectar cambios en el tamaño del contenido. No lo he probado, pero el código debería verse así:

     static int kObservingContentSizeChangesContext; - (void)startObservingContentSizeChangesInWebView:(UIWebView *)webView { [webView.scrollView addObserver:self forKeyPath:@"contentSize" options:0 context:&kObservingContentSizeChangesContext]; } - (void)stopObservingContentSizeChangesInWebView:(UIWebView *)webView { [webView.scrollView removeObserver:self forKeyPath:@"contentSize" context:&kObservingContentSizeChangesContext]; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if (context == &kObservingContentSizeChangesContext) { UIScrollView *scrollView = object; NSLog(@"%@ contentSize changed to %@", scrollView, NSStringFromCGSize(scrollView.contentSize)); } else { [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; } } 

    Si eso no funciona, es posible que setContentSize: método setContentSize: . El método swizzling le permite a su método de reemploop llamar al método original, que es lo que debe hacer para pasar el nuevo tamaño de contenido a la vista de desplazamiento.

    Puede leer más sobre el método swizzling aquí: http://www.mikeash.com/pyblog/friday-qa-2010-01-29-method-replacement-for-fun-and-profit.html

    Creo que este es el código más popular para swizzling: https://github.com/rentzsch/jrswizzle

    Su enfoque es medio correcto. Seguramente puede anular un método existente a través de una categoría, lo que no puede hacer, aunque es acceder a un ivar de la class.

    En este caso, lo que necesita es un swizzling de método: anula setContentSize y al mismo time mantiene una reference a la implementación original del método, por lo que puede llamarlo para establecer el valor _contentSize .

    Aquí está el código que podría usar, con comentarios:

     @implementation UIScrollView (Height) // -- this method is a generic swizzling workhorse // -- it will swap one method impl with another and keep the old one // under your own impl name + (void)swizzleMethod:(SEL)originalSel andMethod:(SEL)swizzledSel { Method original = class_getInstanceMethod(self, originalSel); Method swizzled = class_getInstanceMethod(self, swizzledSel); if (original && swizzled) method_exchangeImplementations(original, swizzled); else NSLog(@"Swizzling Fault: methods not found."); } //-- this is called on the very moment when the categoty is loaded //-- and it will ensure the swizzling is done; as you see, I am swapping //-- setContentSize and setContentSizeSwizzled; + (void)load { [self swizzleMethod:@selector(setContentSize:) andMethod:@selector(setContentSizeSwizzled:)]; } //-- this is my setContentSizeSwizzled implementation; //-- I can still call the original implementation of the method //-- which will be avaiable (*after swizzling*) as setContentSizeSwizzled //-- this is a bit counterintuitive, but correct! - (void)setContentSizeSwizzled:(CGSize)contentSize { [self setContentSizeSwizzled:contentSize]; [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:@"scrollViewContentSizeChanged" object:nil]]; } @end 

    Espero eso ayude.