ios uicollectionview ios9 key-value-observing uiedgeinsets

Contenido de la vista de colección KVO en iOS9



uicollectionview key-value-observing (1)

Con el lanzamiento reciente de iOS 9, puede ser necesario que haya algunas actualizaciones del código existente para compensar los cambios realizados en la API de manzanas. Recientemente, parece que lo han hecho para que las vistas de colección ahora ajusten automáticamente su inserción de contenido cuando aparece un teclado. Esto es útil para las personas que no lo están manejando manualmente o admitiendo múltiples versiones del sistema operativo. En mi aplicación, ha causado un poco de dolor de cabeza. Finalmente se me ocurrió una solución usando KVO para informarme cuando el sistema cambia las inserciones y reacciono en consecuencia, todo funciona bien, con la excepción de una carcasa de borde único.

Si muestro el teclado y luego intento regresar a la pila de navegación mediante un deslizamiento interactivo, beginAppearanceTransition:animated: que beginAppearanceTransition:animated: se llame, pero luego lo cancelo y luego toco el costado del teclado para renunciar al primer respondedor, todo el sistema repentinamente decide que no quiere actualizar automáticamente mis inserciones y mi KVO nunca se activa para la inserción de contenido, el teclado desaparece pero el contenido no se reduce, por lo que también se ve mal ... si toco el campo de texto causando teclado para mostrar de nuevo, de repente decide hacer su actualización automática de nuevo.

¿Alguien tiene alguna idea de por qué ignora mi primer descarte del teclado después de cancelar una transición interactiva para actualizar mis inserciones?

EDITAR

Tener que volver a visitar esto, ya que el equipo considera que es demasiado frágil y hacky, y que después de jugar con esto para descubrir cómo manejan el mismo caso, no parecen tener que lidiar con la llamada errónea de ninguna parte. Así que subclasifica UICollectionView y sustituyo la función setContentInset Function solo para encontrar la llamada ofensiva aquí

IMG http://i63.tinypic.com/2hgqr7t.png

Excepto que el rastro de la pila no es particularmente útil en este punto, ¿alguien tiene alguna idea?


Como no parece que se avecina ninguna respuesta y otras personas se han encontrado con este problema, tal como lo solicité aquí está mi solución actual.

Entonces, después de agregar un observador para el contentInset tengo la siguiente función.

static bool _willSystemUpdateCollectionViewInset = NO; static bool _willCustomKeyboardViewUpdateCollectionViewInset = NO; static bool _didCancelDismissInteraction = NO; - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context { if ([keyPath isEqualToString:NSStringFromSelector(@selector(contentInset))]) { id oldNumber = change[@"old"]; id newNumber = change[@"new"]; if (_willSystemUpdateCollectionViewInset) { _willSystemUpdateCollectionViewInset = NO; UICollectionView *collectionView = (UICollectionView*)object; UIEdgeInsets insets = collectionView.contentInset; insets.bottom = [oldNumber UIEdgeInsetsValue].bottom; [collectionView setContentInset:insets]; } else if (_willCustomKeyboardViewUpdateCollectionViewInset) { _willCustomKeyboardViewUpdateCollectionViewInset = NO; [self updateScrollViewInsets]; } if ([newNumber UIEdgeInsetsValue].bottom > [oldNumber UIEdgeInsetsValue].bottom ) [_messageViewController scrollCollectionViewToBottom:NO]; } else { [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; } }

Entonces, en el teclado que muestra u oculta el indicador _willSystemUpdateCollectionViewInset se establece en SÍ, y la función anterior básicamente niega el cambio que el sistema realiza automáticamente.