Parece que userInteractionEnabled = NO en una vista principal impedirá la interacción del usuario en todas las subvistas. ¿Es esto correcto? ¿Hay alguna forma de evitar esto?UIView - "interacción del usuario habilitada" false en el elemento primario pero verdadero en el elemento secundario?
Respuesta
Correcto, userInteractionEnabled establecido en NO en una vista principal se transferirá en cascada a todas las subvistas. Si necesita algunas subvistas para habilitar la interacción, pero no otras, puede separar sus subvistas en dos vistas principales: una con userInteractionEnabled = YES y la otra NO. Luego ponga esas dos vistas principales en la vista principal.
Gracias lazycs. Mi idea era usar una vista transparente para administrar el diseño de un puñado de vistas de tipo de menú emergente relacionadas. Pero esto no funcionará para mí si la vista de diseño invisible bloquea la interacción con lo que está debajo. Hrrmmmm .... – morgancodes
Sí, la idea de vista transparente no funcionará en este caso. ¿Podría agregar las subvistas a la vista principal directamente? – lazycs
sí, podría hacer. Puede ser mejor utilizar un fondo semitransparente en cualquier caso. No es gran cosa. – morgancodes
Puede subclase UIView y anular hitTest: withEvent: en una forma de pasar eventos de toque a una vista que especifique (_backView):
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
UIView *view = [super hitTest:point withEvent:event];
if (view == self) {
view = _backView;
}
return view;
}
Si el evento tacto era para ser manejado por este punto de vista se pasará a "_backView" (que puede ser un IBOutlet para que se pueda configurar mediante el constructor de interfaz); y si fuera manejado por cualquier vista secundaria simplemente devuelva ese hijo (el resultado de [super hitTest:point withEvent:event]
;)
Esta solución está bien siempre y cuando sepa a qué vista necesita pasar los eventos; además, no sé si tiene problemas ya que estamos devolviendo una vista (_backView) que no es una subvista del UIView actual. pero funcionó bien en mi caso.
Una mejor solución podría ser la que se menciona en Disable touches on UIView background so that buttons on lower views are clickable Allí se menciona su uso -pointInside:withEvent:
; en comparación con la solución anterior es mejor en la forma en que no necesita especificar un '_backView' para recibir los eventos (¡el evento simplemente pasa a la siguiente vista en la cadena)! inconveniente podría ser que tenemos que realizar -pointInside:withEvent:
en todas las subvistas (aunque podría ser de una sobrecarga insignificante)
gracias por el enfoque aquí y el enlace "Desactivar toques ...". el enfoque descrito allí parece bastante limpio. –
gran enfoque :) –
hitTest es demasiado tarde ... esta es la mejor respuesta ... http://stackoverflow.com/questions/3427619/disable-touches-on-uiview-background-so-that-buttons-on -lower-views-are-clickabl –
Me encontré con una situación extraña. Tengo una UIView (llame esto, V), que tiene un UIButton como subvista. Llame a este UIButton, botón X. A continuación se muestra el método que estoy usando para el destino/selector del botón X. A continuación se muestra la vista V. El parámetro del remitente es el botón X.
La situación que me está causando un problema es que si toco otro botón en mi UI (en la barra de navegación, llamo a este botón Y) y luego presiono el botón X, donde la acción del botón Y desactiva la vista V, aún obtengo el evento táctil enviado al botón X.
- (void) buttonAction: (UIButton *) sender
{
NSLog(@"superview: %d", sender.superview.userInteractionEnabled);
NSLog(@"button itself: %d", sender.userInteractionEnabled);
// <snip>
}
Aquí está la salida:
2014-12-19 16: 57: 53.826 MyApp [6161: 960615] supervista: 0
19/12/2014 16: 57: 53.826 MiApl [6161: 960615] propio botón: 1
Es decir, se produjo la acción del botón y el botón de supervista había desactivado la interacción con el usuario! ¡Y la subvista todavía tenía habilitada la interacción del usuario!
Para aquellos de ustedes que piensan que esto parece artificial, en la IU de mi aplicación, ejecutándose en un iPad (con iOS 8.1.2), esto ocurrió accidentalmente al usar la aplicación. No era algo que originalmente fui tratando de generar.
¿Pensamientos?
Mi solución actual se detalla a continuación, ¡pero parece realmente extraño que sea necesario!
- (void) buttonAction: (id) sender
{
NSLog(@"superview: %d", sender.superview.userInteractionEnabled);
NSLog(@"button itself: %d", sender.userInteractionEnabled);
if (! self.userInteractionEnabled) return;
// <snip>
}
Estoy haciendo esto en un xib que es mi "controlador de alerta personalizado".
for (UIView *subview in self.superview.subviews) {
if (![subview isEqual:self]) {
subview.userInteractionEnabled = NO;
}
}
- 1. Cómo aplicar el elemento secundario: pase el mouse pero no el elemento primario: pase el mouse
- 2. Determinación del índice secundario en su elemento primario
- 3. Obteniendo el div primario del elemento
- 4. Elemento secundario de ancho de porcentaje en el elemento primario posicionado en Internet Explorer 7
- 5. jQuery mueve el elemento DOM dentro del elemento primario
- 6. Hacer que el elemento secundario aparezca fuera del elemento principal
- 7. Esquema XML (XSD): cómo especificar que el elemento primario contenga al menos un elemento secundario?
- 8. Cómo evitar que el elemento secundario acolchado desborde a su elemento primario?
- 9. ¿Al hacer clic en el elemento principal, también se puede hacer clic en el elemento secundario?
- 10. Cómo configurar "Interacción del usuario habilitada" en UITextViews en el código
- 11. Establecer el elemento primario de un formulario
- 12. HtmlElement.Parent devuelve el elemento primario incorrecto
- 13. XML xpath, obtenga el elemento primario hasta un elemento específico
- 14. HTML: ¿Obtiene un elemento secundario para mostrar detrás (índice z más bajo) que su elemento primario?
- 15. La altura heredada de un elemento secundario secundario de un elemento primario con un atributo de altura mínima
- 16. Elemento hijo de estilo al pasar el mouse sobre el elemento primario
- 17. C# - Obtiene el elemento primario de ToolStripMenuItem
- 18. ¿Podemos establecer el estilo del elemento principal del estilo secundario?
- 19. ¿Cómo desplazar un elemento dentro del elemento primario cuando pasa un elemento fijo?
- 20. Obtiene el primer elemento secundario inmediato
- 21. El elemento 'comportamiento' tiene el elemento secundario no válido 'myFaultExtension' en wcf app.config
- 22. Evitar que TextView se ajuste en el elemento primario
- 23. Mostrar el elemento hijo encima del elemento principal usando CSS
- 24. Cómo determinar si el elemento es el último o el primer elemento secundario de los elementos principales en javascript/jquery?
- 25. ¿ReflectionClass :: getProperties() también obtiene propiedades del elemento primario?
- 26. Cómo obtener el índice de un elemento primario en jQuery
- 27. abrir la ventana modal de iframe en el elemento primario
- 28. Determinando si el elemento es el último hijo de su elemento primario
- 29. ¿por qué mi subvista UIView no se está procesando dentro del elemento primario? (código adjunto)
- 30. seleccione un elemento secundario en el objeto jquery
sí ese es el caso, y eso es completamente estúpido, como tantas cosas en iOS, ¿dónde están los días en que Apple hacía API simples? Supongo que fue hace casi 20 años, ahora las API están escritas por filósofos. –
. . . cuando no están ocupados escribiendo comentarios de desbordamiento de pila. – tooluser
posible duplicado de [Cómo obtener toques cuando la vista principal tiene userInteractionEnabled establecido en NO en iOS] (http://stackoverflow.com/questions/4661589/how-to-get-touches-when-parent-view-has-userinteractionenabled -set-to-no-in-ios) – DBD