2009-07-13 23 views
14

Khi bạn kéo ngón tay trên màn hình cảm ứng iPhone, nó sẽ tạo ra các sự kiện touchesMoved ở tần số 60Hz thông thường, đẹp mắt.Khi nào một touchesBegan trở thành một touchesMoved?

Tuy nhiên, việc chuyển đổi từ sự kiện touchesBegan ban đầu sang touchesMoved đầu tiên ít rõ ràng hơn: đôi khi thiết bị chờ một thời gian.

Còn chờ gì nữa? Khoảng thời gian/khoảng cách lớn hơn? Thêm nhiều lần chạm vào sự kiện?

Có ai biết không?

Quan trọng là, sự chậm trễ này không xảy ra với các ngón tay tiếp theo, điều này sẽ đặt liên lạc đầu tiên vào một bất lợi riêng biệt. Đó là tin tức rất bất đối xứng và không tốt đối với các ứng dụng yêu cầu đầu vào chính xác, như trò chơi và nhạc cụ.

Để xem lỗi này/hiện tượng trong hành động

  1. chậm kéo iPhone màn hình mở khóa trượt sang bên phải. lưu ý bước nhảy đột ngột & lưu ý cách nó không xảy ra nếu bạn có ngón tay khác nghỉ ngơi ở bất kỳ nơi nào khác trên màn hình

  2. thử "leo" trên một cây cầu hẹp trong bất kỳ số lượng trò chơi 3D nào. Bực bội!

  3. thử trò chơi cần điều khiển ảo kép & lưu ý rằng hiệu ứng được giảm nhẹ bởi vì bạn có nghĩa vụ không bao giờ chấm dứt một trong hai chạm chạm vào đó giúp phân bổ sự khó chịu.

Đã đăng nhập này dưới dạng lỗi cách đây 8 tháng.

Trả lời

0

Chờ đợi lần di chuyển đầu tiên. Đó là cách hệ điều hành phân biệt thao tác kéo từ một lần nhấn. Khi bạn kéo, tất cả các thông báo mới đều được chạm vàoMở.

Đây cũng là lý do tại sao bạn nên viết mã để thực thi khi chạm vào sự kiện.

+0

Tôi tò mò về điều gì tạo nên "động thái đầu tiên". Điểm của bạn "tất cả các thông báo mới là touchesMoved sau khi kéo" là sai: nếu bạn nhấn bằng một ngón tay khác, bạn tất nhiên sẽ nhận được một sự kiện touchesBegan. Tuy nhiên những tiếp xúc sâu hơn này dường như chuyển đổi nhanh hơn nhiều để chạm vào các sự kiện được yêu thích. Hiếu kỳ. Re: các "liên lạc" sự kiện tư vấn, tôi đang thực hiện một cái gì đó nhiều hơn một chút xúc giác hơn nút trung bình của bạn hoặc hộp kiểm, do đó sẽ không cắt nó. –

+0

Tôi có thể xác nhận điều này. Đó là một vấn đề thực sự lớn trong hệ điều hành iPhone. – Thanks

4

Sau khi chạm vào Sự kiện được kích hoạt, UIKit sẽ tìm chuyển động vị trí chạm ngón tay chuyển thành các sự kiện được chạm vào khi ngón tay bị thay đổi cho đến khi ngón tay được nhấc lên và chạm vào Sự kiện được kích hoạt.

Nếu ngón tay được giữ ở một nơi, nó sẽ không kích hoạt sự kiện chạm vào Sự kiện được yêu thích cho đến khi có chuyển động.

Tôi đang xây dựng một ứng dụng mà bạn phải vẽ dựa trên touchesMoved và nó xảy ra trong khoảng thời gian nhưng nó đủ nhanh để tạo ra một hình vẽ trơn tru. Vì đây là sự kiện và được chôn trong SDK, bạn có thể phải thực hiện một số thử nghiệm trong kịch bản của mình để xem tốc độ phản hồi nhanh như thế nào, tùy thuộc vào các hành động hoặc sự kiện khác có thể thay đổi theo tình huống được sử dụng. Theo kinh nghiệm của tôi nó là trong vòng vài ms của phong trào và điều này là với khoảng 2-3k sprites khác trên màn hình.

Bản vẽ sẽ bắt đầu khi chạm vào Sự kiện diễn ra mặc dù vị trí đầu tiên được đặt sau đó nó sẽ được gắn vào phần kết thúc và kết thúc bằng chạm. Tôi sử dụng tất cả các sự kiện cho thao tác kéo, vì vậy có thể di chuyển ban đầu ít bị nhiễu hơn trong trường hợp này.

Để thử nghiệm trong ứng dụng của bạn, bạn có thể đặt dấu thời gian cho mỗi sự kiện nếu nó rất quan trọng đối với thiết kế của bạn và làm việc ra một số loại nới lỏng.

http://developer.apple.com/IPhone/library/documentation/UIKit/Reference/UIResponder_Class/Reference/Reference.html#//apple_ref/occ/instm/UIResponder/touchesMoved:withEvent:

+0

Tôi đã thực hiện việc này. Đối với các chuyển động tốt, "di chuyển" đầu tiên có thể chậm hơn nhiều so với các cặp được chuyển tiếp tiếp theo. Thử vẽ một số đoạn đường được kết nối. Đoạn đầu tiên sẽ dài hơn. Sự khác biệt là tinh tế và tôi nghĩ rằng ứng dụng của tôi đang phóng đại hiệu ứng (nó mô phỏng một bàn xoay). Trừ khi có một giao diện cấp thấp hơn, tôi sẽ chỉ phải giảm thiểu hiệu ứng. –

+1

Có Tôi đang sử dụng một số nội suy và ngoại suy cho hiệu ứng mạng (giảm bớt giữa các điểm và một số dự đoán). Nhưng tại địa phương bạn có thể cần điều này là tốt. Nó phụ thuộc vào ứng dụng của bạn nhưng hãy ghi nhớ nó vẫn là một bộ xử lý chậm và một máy tính cũ thực sự vì vậy nếu bạn có rất nhiều đồ họa và sự kiện sẽ có sự chậm trễ. –

+0

Đối với tôi hành vi này là một lỗi, vì vậy tôi sẽ đăng nhập nó. Ứng dụng của tôi tự nhiên làm mịn các gián đoạn, nhưng tất nhiên nó sẽ được hưởng lợi từ đầu vào cảm ứng đa điểm chất lượng cao hơn từ UIKit. –

1

Tôi không đại diện bất kỳ loại câu trả lời chính thức nhưng nó có ý nghĩa rằng touchesBegan-> touchesMoved có một khoảng thời gian dài hơn touchesMoved-> touchesMoved. Nó sẽ là bực bội cho các nhà phát triển nếu mọi touchesBegan đến cùng với một loạt các sự kiện ngẫu nhiên. Apple phải đã xác định (thử nghiệm) một khoảng cách mà tại đó một liên lạc trở thành một kéo. Một khi touchesMoved đã bắt đầu, không cần phải thực hiện thử nghiệm này nữa bởi vì mọi điểm cho đến khi touchesUp tiếp theo được đảm bảo là touchesMoved.

Điều này có vẻ là những gì bạn đang nói trong bài đăng gốc của bạn, Rythmic Fistman và tôi chỉ muốn xây dựng thêm một chút và nói rằng tôi đồng ý với lý do của bạn. Điều này có nghĩa là nếu bạn đang tính toán "tốc độ kéo" của một số loại, bạn được yêu cầu sử dụng khoảng cách được di chuyển như một yếu tố, thay vì phụ thuộc vào tần số của bộ đếm thời gian cập nhật (thực hành tốt hơn).

+0

Không có gì thông minh về việc chờ 0.25 giây cho đến khi một ứng dụng được báo cáo về việc kéo có ý định, nếu điều duy nhất hợp lý và có thể là một ý định kéo (xem UISlider chẳng hạn). Apple phải cung cấp cho chúng tôi tùy chọn tắt bất kỳ sự chậm trễ nào. – Thanks

+0

Chính xác @ Cảm ơn, cũng @Kai, có lẽ hành vi chậm trễ là mong muốn cho tổng đầu vào, nhưng bạn cần để có thể tắt nó đi. Ngoài ra nó không được áp dụng cho bốn lần chạm khác. Làm thế nào để bạn biện minh cho điều đó? –

0

Hiện tại "độ trễ" như vậy giữa các lần chạmBegan và chạm đượcChọn cũng có khi các ngón tay khác chạm vào màn hình. Thật không may có vẻ như một tùy chọn để vô hiệu hóa nó không tồn tại được nêu ra. Tôi cũng là một nhà phát triển ứng dụng âm nhạc (và người chơi), và tôi thấy hành vi này rất khó chịu.

+0

Có thể có một giải pháp thay thế bằng cách sử dụng thuộc tính delaysContentTouches của UIScrollView nhưng tôi không thể quản lý để làm cho nó hoạt động được. – dnaxxx

2

Tôi không nghĩ đó là lỗi, tính năng còn thiếu hơn.

Thông thường, đây là hành vi dự định lọc ra các chuyển động vi mô ngẫu nhiên sẽ biến đổi một lần nhấn hoặc nhấn lâu vào một trang trình bày khi người dùng không dự định.

Điều này không có gì mới, nó luôn ở đó, ví dụ có một vài điểm ảnh dung sai cho các nhấp chuột kép trong GUI dựa trên con trỏ - hoặc thậm chí là dung sai này trước khi bắt đầu kéo, vì người dùng đôi khi vô tình kéo khi họ chỉ muốn bấm. Hãy thử từ từ di chuyển một mục trên máy tính để bàn (OSX hoặc Windows) để xem nó.

Tính năng bị thiếu là tính năng này dường như không thể định cấu hình được.

Ý tưởng: Có thể nhập vòng lặp theo thời gian trên touchesBegan định kỳ kiểm tra số liên lạc của locationInView:?

+1

Không, không thể sử dụng bộ hẹn giờ w/locationInView, vì điểm mà nó trả về được cập nhật tại cùng thời điểm touchesMoved: được gọi. Có nghĩa là bạn sẽ không bao giờ nhận được vị trí mớiInView trước khi chạm vàoMoved. – Vadoff

+1

Ngoài ra, có vẻ như ngay cả đối tượng ứng dụng cũng không nhận được sự kiện chạm mới trước khi chuyển tiếp sự kiện cho touchesMoved xuống chuỗi trả lời - nghĩa là bản thân hệ điều hành cấp thấp là những gì chịu trách nhiệm cho sự kiện touchesMoved bị trì hoãn. Vì vậy, có lẽ không thể làm việc xung quanh cho đến khi Apple cho phép chúng tôi thay đổi nó. – Vadoff

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