2012-03-04 16 views
20

UIActivityIndicatorViewが回転中にすべての入力を無効にするにはどうすればよいですか?UIActivityIndi​​catorView回転中にすべての入力を無効にする

おかげ

+1

あなたがUIAlertViewにスピナーを追加し、警告を表示する場合:

UIApplication.shared.beginIgnoringInteractionEvents() 

が相互作用を復元するには:

は、相互作用を無効にするにはそれはあなたが何をしているかを達成するでしょう。 – Luke

+0

あなたは[MBProgressHUD](https://github.com/matej/MBProgressHUD)でも素晴らしい効果を得ることができますが、達成しようとしていることに応じてより重くなるかもしれません。 – FluffulousChimp

+0

ありがとうルーク、もし私がそれを消滅させたいのであれば、私はUIAlertViewを "破壊"しますか? 0のボタンを持っても構いませんか? – mica

答えて

50

あなたはそれを停止するときに、スピナー

[[UIApplication sharedApplication] beginIgnoringInteractionEvents]; 

endIgnoringInteractionEventsを起動するときは、beginIgnoringInteractionEventsを呼び出すことができます。

[[UIApplication sharedApplication] endIgnoringInteractionEvents]; 

ちょうどそうあなたのアプリケーションがフリーズします(ユーザの観点から)、あなたのコード は常にあなたは endIgnoringInteractionEventsを呼び出すポイントになることを確認してください。

+0

ありがとう、うまくいきます。しかし、私が見ることができるように、ビューはendIgnoreInteractionsEventの後にタッチを覚えてイベントを発生させます。この動作を変更できますか? – mica

+1

@mica:うわー、これは興味深い観察です。これまで気づいたことはありません。私は見てみましょう。もしあなたが急いでいるなら、アプリケーションのメインウインドウの 'sendEvent:'をハイジャックすることができます。スピンナーがアニメーション化しているかどうかをチェックすることで、レスポンダチェーンをダウンしたり、無視したりすることができます。 このウィンドウをハイジャックする1つの方法は、[ここ](http://stackoverflow.com/questions/9251174/detect-if-the-user-has-touched-the-screen/9293321#9293321)です( 'MyKindOfWindow '定義)。 –

+0

@mica:あなたがバグを見つけたようです。 [ドキュメンテーション](https://developer.apple.com/library/ios/#DOCUMENTATION/EventHandling/Conceptual/EventHandlingiPhoneOS/MultitouchEvents/MultitouchEvents.html)によると、これは起こらないはずです:「あなたのタッチイベントの配信をオフにするアプリケーションは、UIApplicationメソッドのbeginIgnoringInteractionEventsメソッドを呼び出して、endIgnoringInteractionEventsメソッドを呼び出すことができます。最初のメソッドは、アプリケーションがタッチイベントを完全に受信するのを停止し、2番目のメソッドが呼び出されて、そのようなイベントの受信を再開します。 –

1

ロクハルクの回答にちょうど追加。 ここでは、アプリを存続させるウォッチドッグの例を示します。 常に10秒程度の重要な間隔で電話をかけることができます。 10秒以内に有効にする必要がある場合は、 "enable"メソッドを呼び出してください。スウィフト3.0で

UIWindow * __weak mainWindow; 

- (void)disableGlobalUserInteractionForTimeInterval:(NSTimeInterval)interval 
{ 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     mainWindow = [[[UIApplication sharedApplication] windows] lastObject]; 
    }); 

    [mainWindow setUserInteractionEnabled:false]; 

    if (interval > 0) 
    { 
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(interval * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
      [self enableGlobalUserInteraction]; 
     }); 
    } 
} 

- (void)enableGlobalUserInteraction 
{ 
    if (mainWindow) 
    { 
     [mainWindow setUserInteractionEnabled:true]; 
    } 
} 
2

:、

UIApplication.shared.endIgnoringInteractionEvents() 
関連する問題