2012-03-04 19 views
20

Làm thế nào tôi có thể vô hiệu hóa tất cả đầu vào trong khi UIActivityIndicatorView đang quay?Vô hiệu hóa tất cả đầu vào trong khi UIActivityIndicatorView quay

Cảm ơn

+1

Nếu bạn thêm các spinner để một UIAlertView và sau đó hiển thị các cảnh báo, sau đó điều này sẽ đạt được những gì bạn đang sau. – Luke

+0

Bạn cũng có thể đạt được hiệu ứng tốt đẹp với [MBProgressHUD] (https://github.com/matej/MBProgressHUD) nhưng điều đó có thể nặng hơn tùy thuộc vào những gì bạn đang cố gắng đạt được. – FluffulousChimp

+0

cảm ơn Luke, làm thế nào để tôi "phá hủy" UIAlertView nếu tôi muốn nó biến mất. Có OK để có 0 nút không? – mica

Trả lời

50

Bạn có thể gọi beginIgnoringInteractionEvents khi bạn bắt đầu spinner

[[UIApplication sharedApplication] beginIgnoringInteractionEvents]; 

endIgnoringInteractionEvents khi bạn ngăn chặn nó.

[[UIApplication sharedApplication] endIgnoringInteractionEvents]; 

Chỉ cần chắc chắn mã của bạn luôn nói đến điểm mà bạn gọi endIgnoringInteractionEvents, nếu ứng dụng của bạn sẽ đóng băng (từ quan điểm người sử dụng xem).

+0

Cảm ơn, hoạt động tốt. Nhưng như tôi có thể thấy, quan điểm đó "nhớ" một liên lạc và kích hoạt sự kiện sau endIgnoreInteractionsEvent. Hành vi này có thể thay đổi không? – mica

+1

@mica: wow, đó là một quan sát thú vị - đã không nhận thấy điều này trước đây. Tôi sẽ xem qua một chút. Nếu bạn vội vàng, bạn có thể hijaack 'sendEvent:' của cửa sổ chính của ứng dụng và quyết định (ví dụ: bằng cách kiểm tra một số cờ nếu spinner đang hoạt hình hay không) nếu bạn gửi một sự kiện xuống chuỗi trả lời hoặc bỏ qua nó . Một cách để hijaack cửa sổ này là [ở đây] (http://stackoverflow.com/questions/9251174/detect-if-the-user-has-touched-the-screen/9293321#9293321) (câu trả lời với 'MyKindOfWindow 'định nghĩa). –

+0

@mica: có vẻ như bạn đã tìm thấy lỗi. Theo [tài liệu] (https://developer.apple.com/library/ios/#DOCUMENTATION/EventHandling/Conceptual/EventHandlingiPhoneOS/MultitouchEvents/MultitouchEvents.html) điều này không nên xảy ra: "Tắt phân phối sự kiện chạm cho một Một ứng dụng có thể gọi phương thức UIApplication là beginIgnoringInteractionEvents và sau đó gọi phương thức endIgnoringInteractionEvents Phương thức đầu tiên ngăn ứng dụng nhận các sự kiện cảm ứng hoàn toàn, phương thức thứ hai được gọi để tiếp tục nhận các sự kiện như vậy –

1

Chỉ cần thêm vào câu trả lời của rokjarc. Đây là ví dụ về cơ quan giám sát để giữ cho ứng dụng luôn hoạt động. Bạn có thể gọi luôn với một số khoảng thời gian quan trọng, có thể là 10 giây. Và nếu bạn cần bật trong vòng 10 giây, chỉ cần gọi phương thức "bật".

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

Trong Swift 3.0:

Để vô hiệu hóa sự tương tác:

UIApplication.shared.beginIgnoringInteractionEvents() 

Để khôi phục lại sự tương tác:

UIApplication.shared.endIgnoringInteractionEvents()