Frage

Meine App hat mehrere Schaltflächen, die verschiedene Ereignisse auslösen. Der Benutzer sollte NICHT in der Lage sein, mehrere Tasten gedrückt halten. Wie auch immer, mehrere Tasten gedrückt halten, stürzt die App.

Und ja, ich versuche, Multi-Touch in meiner App zu deaktivieren.

Ich habe nicht aktiviert ‚Multiple-Touch‘ in allen xib Dateien, und soweit ich arbeiten kann, die Eigenschaften ‚multipleTouchEnabled‘ und ‚exclusiveTouch‘ Kontrolle, ob die Ansicht Multi-Touch verwendet. Also in meinem applicationDidFinishLaunching habe ich habe dies:

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

Und in jedem meiner Ansicht-Controller Ich habe dies in der viewDidLoad setzen

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

Es ist jedoch noch akzeptiert mehrere Berührungen. Ich könnte so etwas wie disable andere Tasten tun, nachdem ein Aufsetzpunkt Ereignis bekommen, aber dies würde eine hässliche Hack. Sicherlich gibt es eine Möglichkeit, um richtig Multi-Touch zu deaktivieren?

War es hilfreich?

Lösung

Wenn Sie nur eine Taste wollen berührt zu einer Zeit, zu reagieren, müssen Sie exclusiveTouch für diese Schaltfläche setzen, anstatt für die übergeordnete Ansicht. Alternativ können Sie die anderen Tasten deaktivieren, wenn eine Taste, um das „Touch Down“ Ereignis wird.


Hier ist ein Beispiel für die letztere, die besser in meinen Tests funktionierte. Einstellen exclusiveTouch für die Tasten Art-of gearbeitet, aber führte zu einigen interessanten Probleme, wenn Sie mit dem Finger über den Rand einer Taste bewegt, anstatt sie nur klicken.

Sie müssen Steckdosen in Ihrem Controller jede Taste angeschlossen haben, und haben den "Touch Down", "Touch Up Inside" und "Touch Up Outside" Ereignisse an die richtigen Methoden in Ihrem Controller angeschlossen.

#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

Andere Tipps

- (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];
        }
    }
}

Dieser Code ist getestet und perfekt für me.there arbeitet, ist kein App Absturz bei zu einem Zeitpunkt mehr als eine Taste gedrückt wird.

Ihre App stürzt aus einem Grund. Weiter untersuchen, um den Debugger verwenden, zu sehen, was anstatt zu versuchen, falsch ist, um den Fehler zu verstecken.

Edit:

OK, ok, ich muss zugeben, dass ich ein bisschen hart war. Sie haben die exclusiveTouch Eigenschaft auf jede Taste setzen. Das ist alles. Die multipleTouchEnabled Eigenschaft ist irrelevant.

Basierend auf neoevoke Antwort, nur es ein wenig zu verbessern, so dass es auch Subviews' Kinder überprüft, habe ich diese Funktion und es zu meiner utils-Datei:

// 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];
        }
    }
}

Dann wird ein einfacher Aufruf an:

[Utils setExclusiveTouchToChildrenOf:self.view.subviews];

... wird es tun.

Dies wird sehr oft Problem, das von unseren Testern berichtet. Einer der Ansatz, den ich manchmal verwenden, obwohl es bewusst verwendet werden soll, ist Kategorie für UIView zu schaffen, wie diese:

@implementation UIView (ExclusiveTouch)

- (BOOL)isExclusiveTouch
{
    return YES;
}

Wenn Sie Multi-Touch in der gesamten Anwendung deaktivieren möchten, und wollen nicht, Code schreiben für jede Taste, dann können Sie einfach Appearance der Taste verwenden. Schreiben unter der Linie in didFinishLaunchingWithOptions.

UIButton.appearance().isExclusiveTouch = true

Das ist toll !! UIAppearance

Sie können es auch für alle UIView Klasse verwenden, wenn Sie also Multi-Touch für wenige Tasten deaktivieren möchten. Machen Sie eine Custom der Taste und dann

CustomButton.appearance().isExclusiveTouch = true

Es gibt einen weiteren Vorteil, der Ihnen helfen kann. Falls Sie Multi-Touch von Tasten in einer bestimmten ViewController

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

So deaktivieren Sie Multi-Touch in SWIFT:

Sie müssen zuerst einen Auslass jeder Taste haben und danach nur die exklusive Note zu true.Therefore setzen in Sie hätte viewDidLoad():

yourButton.exclusiveTouch = true.

// nicht wirklich notwendig, aber man könnte auch hinzufügen:

self.view.multipleTouchEnabled = false

So ziemlich einfach können Sie verwenden Verwendung von ExclusiveTouch Eigenschaft in diesem Fall machen

[youBtn setExclusiveTouch:YES];

Dies ist ein boolescher Wert, der angibt, ob der Empfänger ausschließlich Touch-Ereignisse behandelt.

Wenn Sie diese Eigenschaft auf YES bewirkt, dass der Empfänger die Lieferung von Touch-Ereignissen zu anderen Ansichten im selben Fenster zu blockieren. Der Standardwert dieser Eigenschaft ist NO.

Für globalen Multi-Touch in Xamarin.iOS

deaktivieren

Kopieren Sie den Code unten:

[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);
}

Und setzen Sie sich auf AppDelegate:

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

Meine Erfahrung ist, dass standardmäßig, ist ein neues Projekt nicht einmal Multi-Touch zu ermöglichen, müssen Sie sie einschalten. Aber ich nehme an, das hängt davon ab, wie Sie angefangen haben. Haben Sie ein mutlitouch Beispiel als Vorlage verwenden?

Zunächst einmal sind Sie absolut sicher Multi-Touch ist? Es ist möglich, einzelne Noten in Folge ziemlich schnell zu erzeugen. Multi-Touch ist mehr über das, was Sie mit zwei oder mehr Fingern tun, wenn sie auf der Oberfläche sind. Vielleicht haben Sie einzige Berührung, aber nicht richtig zu tun mit dem, was passiert, wenn zwei Tasten fast gleichzeitig gedrückt werden.

Ich habe gerade hatte genau dieses Problem.

Die Lösung, die wir mit einfach kamen war eine neue Klasse von UIButton zu erben, die die initWithCoder Methode überschreibt, und verwendet, wo wir in einer Zeit, einen Knopfdruck erforderlich (dh überall.):

@implementation ExclusiveButton

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

@end

Beachten Sie, dass dies nur mit den Tasten arbeitet von nib-Dateien geladen.

Ich habe UIView Klasse Erweiterung und hinzugefügt, um diese beiden Funktionen. und wenn ich Ansicht Kontakt deaktivieren möchte ich rufen Sie einfach [Ansicht makeExclusiveTouch];

- (void) makeExclusiveTouchForViews:(NSArray*)views {
    for (UIView * view in views) {
        [view makeExclusiveTouch];
    }
}

- (void) makeExclusiveTouch {
    self.multipleTouchEnabled = NO;
    self.exclusiveTouch = YES;
    [self makeExclusiveTouchForViews:self.subviews];
}

Wenn Sie Multi-Touch-programmatisch deaktivieren mögen, oder wenn Sie mit cocos2d (keine multipleTouchEnabled Option), können Sie den folgenden Code auf Ihrem ccTouches Delegaten verwenden:

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

Deaktivieren Sie alle Tasten sichtbar "Touch Down" Ereignis und es ihnen ermöglichen, in "Touch Up Inside" Ereignis.

zum Beispiel

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

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

ich beschlossen, dieses Problem auf diese Weise:

NSTimeInterval intervalButtonPressed;

- (IBAction)buttonPicturePressed:(id)sender{ 

    if (([[NSDate date] timeIntervalSince1970] - intervalButtonPressed) > 0.1f) {
        intervalButtonPressed = [[NSDate date] timeIntervalSince1970];
        //your code for button
    }
}

hatte ich mit einigen ungeraden Fällen zu kämpfen, wenn Objekte um eine Ansicht ziehen, wo, wenn Sie ein anderes Objekt zur gleichen Zeit berührt es die touchesBegan Methode feuern würde. Meine Behelfslösung war Interaktion mit dem Benutzer für die übergeordnete Ansicht zu deaktivieren, bis touchesEnded oder touchesCancelled genannt wird.

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
}

Setzen Sie einfach alle relevanten UIView Eigentum exclusiveTouch auf false der Trick.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top