2013-08-12 35 views
8

Trên máy Mac, bạn luôn có thể lấy vị trí của con chuột "bên ngoài luồng sự kiện" (nghĩa là ngay cả khi bạn chưa đăng ký bất kỳ phương thức ủy quyền nào cho số mouseUp: et al) bằng cách gọi [NSEvent mouseLocation].Bắt chạm khi khởi chạy trên iOS

Có cách nào trên iOS để nhận sự kiện chạm hiện tại mà không cần nghe touchesBegan: không?

Tôi hỏi vì có ít nhất một tình huống trong đó touchesBegan không được gọi là: khi khởi chạy ứng dụng, nếu một lần chạm đang diễn ra, chạm vàoBegan không bao giờ được gọi là. Trong thực tế, không phải là bất kỳ phương pháp UIEvent liên quan đến cảm ứng gọi là gần như tôi có thể nói (cũng không phải của UIApplication/UIWindow's sendEvent:, rõ ràng).

Tôi muốn thay đổi hành vi ứng dụng của mình một chút dựa trên việc một lần chạm có đang diễn ra khi khởi chạy hay không. Có cách nào để phát hiện cảm ứng đang diễn ra khi khởi chạy ứng dụng không?

+0

"Tại thời điểm khởi chạy ứng dụng" có ý nghĩa gì đối với ứng dụng của bạn? Bạn có thực hiện bất kỳ hành động tốn thời gian nào trên luồng chính tại thời gian tải không? – yurish

+0

"khi khởi chạy ứng dụng" là "khi người dùng nhấn vào biểu tượng ứng dụng trên bàn đạp và ứng dụng sẽ mở". Không nhận được các sự kiện liên lạc là * không * vì ứng dụng quá nặng nề với việc xử lý nặng; đó là do các lần chạm đang diễn ra khi ứng dụng mở ra không được gửi tới ứng dụng thông qua các phương tiện thông thường. Tôi đang cố gắng tìm hiểu xem có ai biết một cách nào đó ngoài vòng lặp bình thường, có lẽ là phân lớp và ghi đè, để có được những chạm đang diễn ra tùy ý, từ bất kỳ phương thức nào, bất cứ lúc nào. – SG1

+0

Tôi nghĩ rằng điều này là không thể. UIApplication là không thích hợp cho subclassing và đó là điểm vào cho ứng dụng của bạn –

Trả lời

6

Điều này không thể thực hiện được. Lý do đơn giản: Sự kiện chạm không thuộc về ứng dụng của bạn. Mỗi liên lạc thuộc về một số yếu tố giao diện người dùng (hoặc trả lời). Như bạn đã biết, yếu tố này nhận được các tin nhắn bắt đầu, di chuyển, kết thúc, hủy bỏ.

Điều này thậm chí đúng trong ứng dụng được lập trình đúng: Tất cả các sự kiện liên quan đến một liên lạc được gửi đến cùng một đối tượng. Sau khi tất cả, làm thế nào một đối tượng khác sẽ biết phải làm gì với sự kiện đó, và làm thế nào để đối tượng đầu tiên hoàn thành đúng hành vi mong đợi của nó?

Trong khi bạn có thể (hoặc có thể, nhưng có lẽ không nên) tìm thấy một công việc xung quanh trong ứng dụng của bạn, không có cách nào để vượt qua ứng dụng qua cảm ứng.

Và trên máy Mac, bạn có thể truy vấn vị trí chuột, nhưng trong luồng ứng dụng thông thường sẽ luôn có một con chuột xuống trước khi bạn nhận được sự kiện di chuột lên.

Thành thật mà nói, tôi không thấy bất kỳ lý do tại sao điều này sẽ cần thiết anyway ... oh chờ ... Tôi có thể chia biểu tượng ứng dụng của tôi thành nhiều khu vực ... không chắc chắn nó có vi phạm luật riêng tư hay không , tuy nhiên, nếu bạn biết người dùng có biểu tượng của mình trên màn hình ở đâu.

+0

Cảm ơn bạn đã dành thời gian cho câu trả lời và làm rõ. Trong khi điều này có vẻ là câu trả lời chính xác hiện tại, tôi cảm thấy tôi muốn đợi cho đến khi có câu trả lời cho câu hỏi này - ví dụ: trong iOS 9 sau khi báo cáo lỗi của tôi được giải quyết;) Tôi nghĩ rằng tôi có thể thay đổi câu trả lời sau ... – SG1

0

Tôi nghĩ bạn có thể đơn giản "mở rộng" khởi chạy ứng dụng. Khi tôi có các tác vụ tốn thời gian trong khi khởi chạy ứng dụng của mình, tôi đã sử dụng để hiển thị cùng một màn hình giật gân với một UIActivityIndicator trong khi hành động đang được thực hiện.

Bạn có thể chỉ cần tạo NSTimer, chờ khoảng 2 giây và trong thời gian này, hãy kiểm tra chạm, trong khi màn hình khởi động vẫn sẽ hiển thị.

Để thực hiện việc này, trong applicationDidFinishLaunch, hãy đẩy ViewController trông giống hệt như màn hình giật gân và kiểm tra chạm trong ViewController này. Sau 2 giây đó, hãy tiến hành khởi tạo bình thường. Hành vi này cũng giúp ích nếu bạn có các nhiệm vụ tốn thời gian trong quá trình khởi tạo.

Tôi biết, đó là cách giải quyết, nhưng tôi đoán, là không thể kiểm tra chạm vì ứng dụng sẽ hoạt động trên chuỗi chính và chạm cũng xử lý trên chuỗi chính. Điều này có thể xảy ra cũng bởi vì không có ViewControllers hoặc UIWindow khởi tạo và sẵn sàng để nghe chạm.

Hy vọng điều đó sẽ hữu ích.

-2

Bạn có thể thử xử lý hitTest: withEvent: thay vào đó.

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

Kể từ khi theo táo doc "Trả về hậu duệ xa nhất của người nhận trong hệ thống phân cấp view (bao gồm cả bản thân) có chứa một điểm quy định."

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