41

私のアプリには、さまざまなイベントをトリガーするいくつかのボタンがあります。ユーザーは複数のボタンを押したままにすることはできません。とにかく、いくつかのボタンを押し続けると、アプリがクラッシュします。

そのため、アプリでマルチタッチを無効にしようとしています。

すべてのxibファイルで「マルチタッチ」のチェックを外しました。私ができる限り、プロパティ「multipleTouchEnabled」と「exclusiveTouch」は、ビューがマルチタッチを使用するかどうかを制御します。したがって、私の applicationDidFinishLaunching では、次のように記述しました。

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

そして、各View Controllerで、これをviewDidLoadに入れました

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

ただし、複数のタッチは引き続き受け付けます。タッチ ダウン イベントを取得した後に他のボタンを無効にするようなこともできますが、これは醜いハックです。マルチタッチを適切に無効にする方法はありますか?

4

19 に答える 19

48

一度に 1 つのボタンだけがタッチに応答するようにする場合は、親ビューではなく、そのボタンに ExclusiveTouch を設定する必要があります。または、ボタンが「タッチダウン」イベントを取得したときに、他のボタンを無効にすることもできます。


これは後者の例で、私のテストではうまく機能しました。ボタンに exclusiveTouch を設定すると、ある程度は機能しましたが、ボタンをクリックするだけでなく、ボタンの端から指を離すと、いくつかの興味深い問題が発生しました。

コントローラーのアウトレットを各ボタンに接続し、「Touch Down」、「Touch Up Inside」、および「Touch Up Outside」イベントをコントローラーの適切なメソッドにフックする必要があります。

#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
于 2009-07-03T17:40:44.070 に答える
21
- (void)viewDidLoad {
    [super viewDidLoad];

    for(UIView* v in self.view.subviews)
    {
        if([v isKindOfClass:[UIButton class]])
        {
            UIButton* btn = (UIButton*)v;
            [btn setExclusiveTouch:YES];
        }
    }
}
于 2011-06-03T08:01:35.980 に答える
6
- (void)viewDidLoad {
    [super viewDidLoad];

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

このコードはテスト済みで、完全に機能しています。一度に複数のボタンを押してもアプリがクラッシュすることはありません。

于 2013-11-23T06:10:56.287 に答える
5

何らかの理由でアプリがクラッシュします。さらに調査し、デバッガーを使用して、バグを隠そうとするのではなく、何が問題なのかを確認してください。

編集:

わかりました、わかりました、私は少し厳しいことを認めなければなりません。各ボタンに ExclusiveTouch プロパティを設定する必要があります。それで全部です。multipleTouchEnabled プロパティは関係ありません。

于 2009-07-03T16:33:27.787 に答える
4

SWIFT でマルチタッチを無効にするには:

最初にすべてのボタンのアウトレットが必要で、その後、排他的なタッチを true に設定する必要viewDidLoad()があります。したがって、次のようになります。

yourButton.exclusiveTouch = true.

// 実際には必要ありませんが、以下を追加することもできます:

self.view.multipleTouchEnabled = false

于 2015-11-25T08:47:15.057 に答える
3

これは、テスターに​​よって報告されることが非常に多い問題です。私が時々使用しているアプローチの 1 つは、意識的に使用する必要がありますがUIView、次のように のカテゴリを作成することです。

@implementation UIView (ExclusiveTouch)

- (BOOL)isExclusiveTouch
{
    return YES;
}
于 2014-11-25T10:48:08.127 に答える
3

neoevoke の回答に基づいて、サブビューの子もチェックするように少しだけ改善して、この関数を作成し、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];
        }
    }
}

次に、次の単純な呼び出しを行います。

[Utils setExclusiveTouchToChildrenOf:self.view.subviews];

... トリックを行います。

于 2013-12-20T08:59:36.573 に答える
2

この場合、ExclusiveTouch プロパティを使用するのは非常に簡単です。

[youBtn setExclusiveTouch:YES];

これは、レシーバーがタッチ イベントを排他的に処理するかどうかを示すブール値です。

このプロパティを YES に設定すると、レシーバーは同じウィンドウ内の他のビューへのタッチ イベントの配信をブロックします。このプロパティのデフォルト値は NO です。

于 2016-08-25T18:34:35.413 に答える
0

私はまさにこの問題を抱えていました。

私たちが思いついた解決策は、initWithCoder メソッドをオーバーライドする UIButton から新しいクラスを継承し、一度に 1 つのボタンを押す必要がある場所 (つまり、あらゆる場所) でそれを使用することでした。

@implementation ExclusiveButton

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

@end

これは、nib ファイルからロードされたボタンでのみ機能することに注意してください。

于 2010-05-24T12:04:44.773 に答える
0

「Touch Down」イベントでビュー上のすべてのボタンを無効にし、 「Touch Up Inside」イベントでそれらを有効にします。

例えば

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

- (void) handleTouchUpInside {
    for (UIButton *btn in views) {
        btn.enable = Yes;
    }
    ------
    ------
}
于 2014-01-11T11:15:45.657 に答える
0

ビューの周りでオブジェクトをドラッグするときに、いくつかの奇妙なケースに苦労しました。別のオブジェクトに同時に触れると、touchesBegan メソッドが起動されます。私の回避策は、touchesEnded または touchesCancelled が呼び出されるまで、親ビューのユーザー操作を無効にすることでした。

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
}
于 2016-01-27T17:07:31.697 に答える
-1

関連するすべての UIView のプロパティ ExclusiveTouch を false に設定するだけでうまくいきます。

于 2014-12-28T16:54:37.593 に答える