volver toque sensibilidad puedo por para pantalla home flotante desactivar control como boton atras asistencia activar iphone uiview multi-touch

iphone - toque - Cómo deshabilitar multitouch?



sensibilidad pantalla iphone 7 (18)

Acabo de tener exactamente este problema.

La solución que se nos ocurrió fue simplemente heredar una nueva clase de UIButton que anula el método initWithCoder, y usar eso donde necesitamos presionar un botón a la vez (es decir, en todas partes):

@implementation ExclusiveButton (id)initWithCoder: (NSCoder*)decoder { [self setExclusiveTouch:YES]; return [super initWithCoder:decoder] } @end

Tenga en cuenta que esto solo funciona con botones cargados desde archivos nib.

Mi aplicación tiene varios botones que activan diferentes eventos. El usuario NO debería poder mantener apretados varios botones. De todos modos, presionar varios botones bloquea la aplicación.

Y entonces, estoy tratando de deshabilitar multi-touch en mi aplicación.

He desmarcado ''Multiple Touch'' en todos los archivos xib, y hasta donde puedo llegar, las propiedades ''multipleTouchEnabled'' y ''exclusiveTouch'' controlan si la vista usa multitouch. Entonces en mi aplicación Decidir Inicio, he puesto esto:

self.mainViewController.view.multipleTouchEnabled=NO; self.mainViewController.view.exclusiveTouch =YES;

Y en cada uno de mis controladores de vista he puesto esto en viewDidLoad

self.view.multipleTouchEnabled=NO; self.view.exclusiveTouch=YES;

Sin embargo, todavía acepta toques múltiples. Podría hacer algo así como desactivar otros botones después de obtener un evento de aterrizaje, pero esto sería un hack feo. Sin duda, hay una forma de deshabilitar correctamente el multitáctil?


Basado en la respuesta de neoevoke, solo mejorando un poco para que también compruebe los hijos de las subvistas, creé esta función y la agregué a mi archivo utils:

// Set exclusive touch to all children + (void)setExclusiveTouchToChildrenOf:(NSArray *)subviews { for (UIView *v in subviews) { [self setExclusiveTouchToChildrenOf:v.subviews]; if ([v isKindOfClass:[UIButton class]]) { UIButton *btn = (UIButton *)v; [btn setExclusiveTouch:YES]; } } }

Entonces, una simple llamada a:

[Utils setExclusiveTouchToChildrenOf:self.view.subviews];

... hará el truco.


Bastante simple puede usar hacer uso de la propiedad ExclusiveTouch en este caso

[youBtn setExclusiveTouch:YES];

Este es un valor booleano que indica si el receptor maneja eventos táctiles exclusivamente.

Establecer esta propiedad en YES hace que el receptor bloquee la entrega de eventos táctiles a otras vistas en la misma ventana. El valor predeterminado de esta propiedad es NO.


Creé UIView Class Extension y agregué estas dos funciones. y cuando quiero desactivar la vista táctil solo llamo a [ver makeExclusiveTouch];

- (void) makeExclusiveTouchForViews:(NSArray*)views { for (UIView * view in views) { [view makeExclusiveTouch]; } } - (void) makeExclusiveTouch { self.multipleTouchEnabled = NO; self.exclusiveTouch = YES; [self makeExclusiveTouchForViews:self.subviews]; }


Decidí este problema de esta manera:

NSTimeInterval intervalButtonPressed; - (IBAction)buttonPicturePressed:(id)sender{ if (([[NSDate date] timeIntervalSince1970] - intervalButtonPressed) > 0.1f) { intervalButtonPressed = [[NSDate date] timeIntervalSince1970]; //your code for button } }


Desactive todos los botones en la vista en el evento "Touch Down" y habilítelos en el evento "Touch Up Inside" .

por ejemplo

- (void) handleTouchDown { for (UIButton *btn in views) { btn.enable = NO; } } - (void) handleTouchUpInside { for (UIButton *btn in views) { btn.enable = Yes; } ------ ------ }


Esto es bastante a menudo un problema informado por nuestros probadores. Uno de los enfoques que estoy usando a veces, aunque debería usarse conscientemente, es crear una categoría para UIView , como esta:

@implementation UIView (ExclusiveTouch) - (BOOL)isExclusiveTouch { return YES; }


He luchado con algunos casos extraños al arrastrar objetos alrededor de una vista, donde si tocabas otro objeto al mismo tiempo, se activaba el método touchesBegan. Mi solución fue deshabilitar la interacción del usuario para la vista principal hasta que se llame a toquesEnded o toques cancelados.

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { // whatever setup you need self.view.userInteractionEnabled = false } override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { // whatever setup you need self.view.userInteractionEnabled = true } override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) { // whatever setup you need self.view.userInteractionEnabled = true }


Mi experiencia es que, de forma predeterminada, un nuevo proyecto ni siquiera permite multitouch, tienes que activarlo. Pero supongo que eso depende de cómo empezaste. ¿Usaste un ejemplo de mutlouch como plantilla?

Antes que nada, ¿estás absolutamente seguro de que está activado el multitouch? Es posible generar toques individuales en secuencia bastante rápido. Multitouch es más sobre lo que haces con dos o más dedos una vez que están en la superficie. Tal vez tiene un solo toque pero no está tratando correctamente con lo que sucede si se presionan dos botones casi al mismo tiempo.


Para deshabilitar multitouch en SWIFT:

Primero necesita tener una salida de cada botón y luego simplemente establecer el toque exclusivo en verdadero. Por lo tanto, en viewDidLoad() tendría:

yourButton.exclusiveTouch = true

// no es realmente necesario pero también puedes agregar:

self.view.multipleTouchEnabled = false


Para deshabilitar multitouch global en Xamarin.iOS

Copie y pegue el código a continuación:

[DllImport(ObjCRuntime.Constants.ObjectiveCLibrary, EntryPoint = "objc_msgSend")] internal extern static IntPtr IntPtr_objc_msgSend(IntPtr receiver, IntPtr selector, bool isExclusiveTouch); static void SetExclusiveTouch(bool isExclusiveTouch) { var selector = new ObjCRuntime.Selector("setExclusiveTouch:"); IntPtr_objc_msgSend(UIView.Appearance.Handle, selector.Handle, isExclusiveTouch); }

Y configúralo en AppDelegate:

public override bool FinishedLaunching(UIApplication app, NSDictionary options) { ... SetExclusiveTouch(true); // setting exlusive to true disables the multitouch ... }


Si desea deshabilitar el toque múltiple en toda la aplicación y no desea escribir código para cada botón, simplemente puede usar Appearance del botón. Escriba la línea siguiente en didFinishLaunchingWithOptions .

UIButton.appearance().isExclusiveTouch = true

¡¡Eso es genial!! UIAppearance

Incluso puede usarlo para cualquiera de las UIView de UIView así que si quiere deshabilitar el toque múltiple para algunos botones. Haz una clase personalizada de botón y luego

CustomButton.appearance().isExclusiveTouch = true

Hay una ventaja más que puede ayudarte. En caso de que quiera deshabilitar el toque múltiple de botones en un ViewController particular

UIButton.appearance(whenContainedInInstancesOf: [ViewController2.self]).isExclusiveTouch = true


Si desea deshabilitar multitouch mediante programación, o si está utilizando cocos2d (opción no multipleTouchEnabled), puede usar el siguiente código en su delegado de ccTouch:

- (BOOL)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { NSSet *multiTouch = [event allTouches]; if( [multiTouch count] > 1) { return; } else { //else your rest of the code }


Si solo desea que un botón responda a los toques a la vez, debe establecer exclusiveTouch para ese botón, en lugar de para la vista principal. Alternativamente, puede desactivar los otros botones cuando un botón recibe el evento "Touch Down".

Aquí hay un ejemplo de este último, que funcionó mejor en mis pruebas. Configurar el toque exclusivo para los botones funcionó, pero dio lugar a algunos problemas interesantes cuando movió el dedo fuera del borde de un botón, en lugar de simplemente hacer clic en él.

Necesita tener salidas en su controlador conectadas a cada botón, y tener los eventos "Touch Down", "Touch Up Inside" y "Touch Up Outside" enganchados a los métodos adecuados en su controlador.

#import "multibuttonsViewController.h" @implementation multibuttonsViewController // hook this up to "Touch Down" for each button - (IBAction) pressed: (id) sender { if (sender == one) { two.enabled = false; three.enabled = false; [label setText: @"One"]; // or whatever you want to do } else if (sender == two) { one.enabled = false; three.enabled = false; [label setText: @"Two"]; // or whatever you want to do } else { one.enabled = false; two.enabled = false; [label setText: @"Three"]; // or whatever you want to do } } // hook this up to "Touch Up Inside" and "Touch Up Outside" - (IBAction) released: (id) sender { one.enabled = true; two.enabled = true; three.enabled = true; } @end


Simplemente configure todas las propiedades relevantes de UIView exclusiveTouch para que false haga el truco.


Tu aplicación falla por un motivo. Investigue más a fondo, use el depurador, vea lo que está mal en lugar de tratar de ocultar el error.

Editar:

OK, vale, tengo que admitir que fui un poco duro. Debe configurar la propiedad Exclusive Touch en cada botón . Eso es todo. La propiedad multipleTouchEnabled es irrelevante.


- (void)viewDidLoad { [super viewDidLoad]; for(UIView* v in self.view.subviews) { if([v isKindOfClass:[UIButton class]]) { UIButton* btn = (UIButton*)v; [btn setExclusiveTouch:YES]; } } }


- (void)viewDidLoad { [super viewDidLoad]; for(UIView* v in self.view.subviews) { if([v isKindOfClass:[UIButton class]]) { UIButton* btn = (UIButton*)v; [btn setExclusiveTouch:YES]; } } }

Este código ha sido probado y funciona perfectamente para mí. No se produce un bloqueo de la aplicación al presionar más de un botón a la vez.