2011-12-09 33 views
18

Có thể nào đó lắng nghe và nắm bắt tất cả các sự kiện chạm xảy ra trong ứng dụng không?Nghe tất cả các sự kiện liên lạc trong một ứng dụng iOS

Ứng dụng tôi hiện đang phát triển sẽ được sử dụng trong các phòng trưng bày và kiốt thông tin và do đó tôi muốn hoàn nguyên phần bắt đầu của ứng dụng nếu không nhận được lần chạm nào trong một vài phút nhất định. Một loại chức năng bảo vệ màn hình, nếu bạn muốn. Tôi đang lập kế hoạch để thực hiện điều này bằng cách có một bộ đếm thời gian chạy trong nền, mà nên được thiết lập lại và khởi động lại mỗi khi một sự kiện cảm ứng xảy ra ở đâu đó trong ứng dụng. Nhưng làm thế nào tôi có thể nghe các sự kiện liên lạc? Bất kỳ ý tưởng hoặc đề xuất nào?

Trả lời

31

Thực sự dễ dàng.

Bạn cần một lớp con của UIApplication (hãy gọi số MyApplication).

Bạn sửa đổi của bạn main.m để sử dụng nó:

 

return UIApplicationMain(argc, argv, @"MyApplication", @"MyApplicationDelegate"); 
 

Và bạn ghi đè lên các phương pháp [MyApplication sendEvent:]:

 

- (void)sendEvent:(UIEvent*)event { 
    //handle the event (you will probably just reset a timer) 

    [super sendEvent:event]; 
} 
 
+0

Kích thước xuống của việc này là chúng ta không thể làm được điều này khi chạy. Bất kỳ cách giải quyết nào khác? – Legoless

+0

làm thế nào để con số mà ngay cả nó? –

+0

@AsadullahAli Xem tài liệu 'UIEvent' (https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIEvent_Class/index.html). Mỗi sự kiện có một loại, một loại phụ và cũng là một tập hợp các chạm bạn có thể kiểm tra. – Sulthan

1

Bạn có thể đặt một cái nhìn minh bạch ở phía trên cùng của hệ thống phân cấp xem, và chọn trong xem liệu có xử lý các sự kiện cảm ứng mà nó nhận được hay chuyển qua các chế độ xem thấp hơn hay không.

+0

Điều đó sẽ chỉ hoạt động đối với một ứng dụng chỉ hiển thị một chế độ xem. Nó phá vỡ ví dụ ngay sau khi bạn trình bày một bộ điều khiển xem. – DarkDust

+0

Không nếu bạn kiến ​​trúc sư các chế độ xem chính xác. –

+1

Vâng, một 'currentModalViewController: animated:' sẽ che khuất tầm nhìn của bạn hoặc tôi đang thiếu cái gì đó? Hoặc bạn đang đề xuất để có cái nhìn trong suốt được chèn vào mọi bộ điều khiển xem? Điều đó chắc chắn sẽ là rất nhiều công việc và mong manh như bạn phải luôn luôn đảm bảo không vô tình đặt một cái nhìn trên nó. Hoặc là có một cách dễ dàng để đảm bảo điều này? – DarkDust

3

Một lớp con của UIWindow có thể được sử dụng để thực hiện việc này, bằng cách ghi đè hitTest:. Sau đó, trong XIB của cửa sổ chính của bạn, có một đối tượng thường được gọi đơn giản là Window. Bấm vào đó, sau đó ở bên phải trong cửa sổ Tiện ích, đi tới Danh tính (Alt-Command-3). Trong trường văn bản Lớp, hãy nhập tên của lớp con UIWindow của bạn.

MyWindow.h

@interface MyWindow : UIWindow 
@end 

MyWindow.m

@implementation MyWindow 

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    UIView *res; 

    res = [super hitTest:point withEvent:event]; 

    // Setup/reset your timer or whatever your want to do. 
    // This method will be called for every touch down, 
    // but not for subsequent events like swiping/dragging. 
    // Still, might be good enough if you want to measure 
    // in minutes. 

    return res; 
} 

@end 
+0

Vấn đề ở đây là bạn không nhận được bất kỳ thông tin nào khi chạm vào kết thúc. – Legoless

2

Bạn có thể sử dụng một trình nhận dạng cử chỉ tap cho việc này. Phân lớp UITapGestureRecognizer và nhập <UIKit/UIGestureRecognizerSubclass.h>. Điều này xác định touchesBegan:, touchesMoved:, touchesEnded:touchesCancelled:. Đặt mã xử lý cảm ứng của bạn theo các phương pháp thích hợp.

Khởi tạo trình nhận dạng cử chỉ trong application:didFinishLaunchingWithOptions: và thêm nó vào UIWindow. Đặt cancelsTouchesInView thành NO và nó sẽ vượt qua tất cả các chạm thông qua một cách minh bạch.

Tín dụng: this post.

3

Tạo một Class "VApplication" mà kéo dài từ UIApplication và dán các mã để lớp tương ứng

VApplication.h

#import <Foundation/Foundation.h> 

// # of minutes before application times out 
#define kApplicationTimeoutInMinutes 10 

// Notification that gets sent when the timeout occurs 
#define kApplicationDidTimeoutNotification @"ApplicationDidTimeout" 

/** 
* This is a subclass of UIApplication with the sendEvent: method 
* overridden in order to catch all touch events. 
*/ 

@interface VApplication : UIApplication 
{ 
    NSTimer *_idleTimer; 
} 

/** 
* Resets the idle timer to its initial state. This method gets called 
* every time there is a touch on the screen. It should also be called 
* when the user correctly enters their pin to access the application. 
*/ 
- (void)resetIdleTimer; 

@end 

VApplication.m

#import "VApplication.h" 
#import "AppDelegate.h" 

@implementation VApplication 

- (void)sendEvent:(UIEvent *)event 
{ 
    [super sendEvent:event]; 
    // Fire up the timer upon first event 
    if(!_idleTimer) { 
     [self resetIdleTimer]; 
    } 

    // Check to see if there was a touch event 
    NSSet *allTouches  = [event allTouches]; 

    if ([allTouches count] > 0) 
     { 
     UITouchPhase phase = ((UITouch *)[allTouches anyObject]).phase; 
     if (phase == UITouchPhaseBegan) 
      { 
      [self resetIdleTimer];   
      } 
     } 
} 

- (void)resetIdleTimer 
{ 
    if (_idleTimer) 
     { 
     [_idleTimer invalidate]; 
     } 

    // Schedule a timer to fire in kApplicationTimeoutInMinutes * 60 


// int timeout = [AppDelegate getInstance].m_iInactivityTime; 
    int timeout = 3; 
    _idleTimer = [NSTimer scheduledTimerWithTimeInterval:timeout 
                target:self 
               selector:@selector(idleTimerExceeded) 
               userInfo:nil 
               repeats:NO]; 

} 

- (void)idleTimerExceeded 
{ 
    /* Post a notification so anyone who subscribes to it can be notified when 
    * the application times out */ 


    [[NSNotificationCenter defaultCenter] 
    postNotificationName:kApplicationDidTimeoutNotification object:nil]; 
} 


@end 

Thay thế tên Class "VApplication" để

Main.m của chúng tôi

tập tin như thế này

int main(int argc, char * argv[]) 
{ 
    @autoreleasepool { 
     return UIApplicationMain(argc, argv, @"VApplication", NSStringFromClass([AppDelegate class])); 

    } 
} 

Đăng ký một thông báo cho tương ứng của bạn xem bộ điều khiển

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidTimeout:) name:kApplicationDidTimeoutNotification object:nil]; 

Và một khi thời gian chờ xuất hiện các thông báo sẽ sa thải và xử lý các sự kiện như thế này

- (void) applicationDidTimeout:(NSNotification *) notif //inactivity lead to any progress 
{ 


} 
+0

Cảm ơn, tôi cần sử dụng điều này vì UITapGestureRecognizer đã không bắt được tất cả sự kiện liên lạc cho tôi. – Pellet

Các vấn đề liên quan