2011-09-22 39 views
5

Tôi đã thử một số thứ và để đăng mã tại thời điểm này có thể sẽ gây nhầm lẫn, vì vậy hãy để tôi bắt đầu với khái niệm.iPhone: Làm thế nào để kết hợp thao tác kéo dài và thao tác kéo với nhau trên bản đồ?

Tôi cần phải bằng cách nào đó kết hợp các hoạt động của bấm và kéo dài vào một thao tác đơn lẻ, giống như LongPressThenDragGestureRecognizer. Tôi đang cố gắng để thực hiện điều này trên một MKMapView, vì vậy tôi không thể chỉ vô hiệu hóa tương tác người dùng toàn bộ thời gian, bởi vì tôi muốn các chức năng pan và zoom của bản đồ.

Để làm phức tạp mọi thứ một chút, mục ban đầu (đối tượng MKOverlay) mà người dùng nhấn lâu để nhận ra tương tác sẽ cần phải được xóa và thay thế bằng đối tượng mới được vẽ. Tại thời điểm đó, mã không quan tâm đến đối tượng nữa, chỉ khi ngón tay ở bất kỳ điểm nào (tôi sẽ vẽ lại đối tượng đã kéo khi chúng di chuyển).

Đây là quy trình làm việc:

  1. tài được trình bày một lớp phủ trên bản đồ
  2. chạm người dùng và giữ vào mục để cho các ứng dụng biết họ muốn kéo nó
  3. Ứng dụng thay thế che phủ với một đối tượng được vẽ và vô hiệu hóa bản đồ để nó không bắt đầu panning (thay vì kéo).
  4. Người dùng kéo ngón tay và đối tượng vẽ lại khi di chuyển.
  5. tài thang máy ngón tay để hoàn thành việc kéo
  6. App thay thế các đối tượng được vẽ bằng một lớp phủ bản đồ mới
  7. App cho phép tương tác người dùng trên bản đồ để cho phép pan/zoom/lựa chọn chú thích vv

Tôi đã thử một số thứ cho đến nay, với rất ít thành công. Kết quả tốt nhất tôi có cho đến nay được liệt kê dưới đây. Điều này đã được thực hiện bằng cách sử dụng một UILongPressGestureRecognizer trên các đối tượng MKMapView (kiểm tra giao lộ với lớp phủ), và sau đó ghi đè chạm vàoBegan để kéo liên lạc bản đồ.

  • Overlay được hiển thị và người dùng thực hiện thành công một cử chỉ dài báo chí đó được công nhận một cách thích hợp
  • Bản đồ tương tác người dùng bị vô hiệu hóa và lớp phủ được thay thế bằng hình vẽ tay
  • Người dùng đã để nhấc ngón tay và chạm xuống một lần nữa để bắt đầu hoạt động kéo
  • Khi sử dụng thang máy ngón tay, lớp phủ mới được vẽ và bản đồ tương tác được kích hoạt một lần nữa

Tôi rất gần, tôi chỉ không biết cách kết hợp các cử chỉ thành một, để người dùng không phải nhấc ngón tay lên và chạm xuống lần nữa để bắt đầu kéo.

Bất kỳ ý tưởng nào được đánh giá cao.

+0

Tôi đã thực hiện điều này trước một cách đơn giản hơn nhưng sử dụng bấm và giữ để kéo không kéo ít hơn. Tôi đã làm nó với một bool đơn giản. Một báo chí dài thiết lập một bool để có sau 0,25 giây và cử chỉ kéo chỉ được phép trở lại nếu bool là có. –

Trả lời

0

Nếu đó là một cử chỉ phức tạp như thế này, tôi sẽ bị cám dỗ để tránh một bộ nhận dạng cử chỉ hoàn toàn và di chuyển để chạm vàoBegan, chạm vàoMoved, chạmEnded, touchesCố với một số trạng thái mà bạn di chuyển mặc dù cử chỉ xảy ra để biết bạn đang ở đâu.

MKMapView có lớp cơ sở UIResponder nên bạn có thể dễ dàng tạo ra phiên bản MKMapView có nguồn gốc của riêng bạn, đáp ứng các sự kiện chạm (nhớ chuyển chúng đến siêu bản đồ để duy trì chức năng bình thường).