Video: 9 tính năng ẩn cực hay trên iPhone X mà Apple không nói 2025
Thật tuyệt khi có thể kéo một chiếc xe hơi và đặt nó ở bất cứ đâu trên màn hình trong ứng dụng iOS của bạn. Tại đây, bạn sẽ tìm hiểu cách tạo mã cho việc kéo một đối tượng, cũng như cách thức hoạt động trên một thiết bị iOS.
Sự chạm nhẹ của một ngón tay (hoặc nhấc nó lên từ màn hình) thêm một sự kiện chạm vào hàng đợi sự kiện của ứng dụng, nơi nó đóng gói (chứa) trong một đối tượng UIEvent. Một đối tượng UITouch tồn tại cho mỗi ngón tay chạm vào màn hình, cho phép bạn theo dõi các chạm cá nhân.
Các liên lạcBegan: withEvent: tin nhắn được gửi khi một hoặc nhiều ngón tay chạm vào trong chế độ xem. Thông báo này là một phương pháp của lớp cha của TestDriveController, UIResponder, từ đó bộ điều khiển chế độ xem có nguồn gốc.
Khi người dùng tiếp tục chạm vào màn hình bằng ngón tay của mình, hệ thống báo cáo các thay đổi cho mỗi ngón tay trong đối tượng UITouch tương ứng, do đó gửi chạm vàoMoved: withEvent: tin nhắn. Dấu chạmEnded: withEvent: thông báo được gửi khi một hoặc nhiều ngón tay nhấc khỏi chế độ xem có liên quan. Các touchesCancelled: vớiEvent: tin nhắn, mặt khác, được gửi khi một sự kiện hệ thống (như một cảnh báo bộ nhớ thấp) hủy bỏ một sự kiện cảm ứng.
Trong ứng dụng này, bạn chỉ cần quan tâm đến hai phương pháp đầu tiên được mô tả.
Để bắt đầu quá trình phản hồi cho một sự kiện chạm, thêm một biến cá thể mới (được in đậm) vào TestDriveController. m tập tin thực hiện.
@interface TestDriveController () {AVAudioPlayer * backgroundAudioPlayer; SystemSoundID burnRubberSoundID; BOOL touchInCar; } -d
Tiếp theo, thêm touchesBegan: method vào TestDriveController. m để bắt đầu theo dõi các chạm. (Bạn đang thực sự trọng hơn phương pháp này vì UIViewController kế thừa nó từ lớp cơ sở UIResponder.)
- (void) touchesBegan: (NSSet *) chạm vớiEvent: (UIEvent *) event {UITouch * touch = [touches anyObject]; nếu (CGRectContainsPoint (khung xe tự, [touch locationInView: self. view])) touchInCar = CÓ; else {touchInCar = KHÔNG; Như đã đề cập trước đó, touchesBegan: withEvent: message được gửi khi một hoặc nhiều ngón tay chạm vào trong một khung nhìn. Các chạm vào bản thân được chuyển đến phương pháp trong một đối tượng NSSet - một bộ sưu tập không có thứ tự của các phần tử riêng biệt.
Để truy cập một đối tượng trong NSSet, sử dụng phương thức anyObject - nó trả về một trong các đối tượng trong tập hợp. Đối với mục đích của chúng tôi ở đây, bạn giả định chỉ một đối tượng - nhưng bạn có thể tự mình khám phá vấn đề này để bạn có thể hiểu cách xử lý các khả năng bổ sung.
Đoạn mã dưới đây chỉ ra cách thiết lập phương thức anyObject:
UITouch * touch = [touches anyObject];
Tiếp theo, mã xác định xem sự kiện chạm của người dùng có ở chế độ xem Xe (UIImage):
if (CGRectContainsPoint (self.xe hơi. khung, [touch locationInView: self. view]))
CGRectContainsPoint là một chức năng trả về YES khi một hình chữ nhật (xem tọa độ) có chứa một điểm. Bạn chỉ định khung xe là hình chữ nhật:
tự. xe hơi. frame
và bạn xác định điểm bằng cách gửi vị tríInView: tin nhắn đến số liên lạc:
locationInView: tự. xem
locationInView: trả về vị trí hiện tại của máy thu trong hệ tọa độ của khung nhìn đã cho. Trong trường hợp này, bạn đang sử dụng chế độ xem Chính, nhưng có thể bạn muốn thay đổi chế độ xem nếu bạn đang cố xác định vị trí trong một chế độ xem khác. Có thể người dùng chạm vào bàn đạp xăng itty-bitty.
Nếu xác định rằng liên lạc là ở trong xe, bạn chỉ định YES cho biến thể Ví dụIncar; nếu không, bạn chỉ định KHÔNG và chuyển tiếp thông điệp lên chuỗi trả lời. Bạn sử dụng touchInCar sau để xác định liệu người dùng đang kéo xe xung quanh hay chỉ cần chạy ngón tay của mình trên màn hình.
Thực hiện mặc định của touchesBegan: không làm gì. Tuy nhiên, các lớp con có nguồn gốc trực tiếp từ UIResponder, đặc biệt là UIView, chuyển tiếp thông điệp lên chuỗi trả lời. Để chuyển tiếp thư đến người trả lời tiếp theo, hãy gửi thông báo tới siêu (thực hiện lớp cha).
Nếu bạn ghi đè lên chạm vàoBegan: withEvent: không gọi siêu (mẫu sử dụng phổ biến), bạn cũng phải ghi đè các phương pháp khác để xử lý sự kiện chạm, nếu chỉ là triển khai còn sơ khai (trống).
Nhiều lần chạm được tắt theo mặc định. Để cho phép ứng dụng của bạn nhận được nhiều sự kiện chạm, bạn phải đặt thuộc tính multipleTouchEnabled của thể hiện xem tương ứng thành YES.
Khi người dùng di chuyển chiếc xe xung quanh màn hình (có thể nói
zoom zoom cho chính họ), ứng dụng của bạn liên tục được gửi chạm vàoMoveed: message. Thêm mã trong Liệt kê 10-13 vào TestDriveController. m để ghi đè lên phương pháp đó, sẽ cho phép bạn di chuyển chiếc xe đến ngón tay của người dùng. - (void) touchesMoved: (NSSet *) chạm vớiEvent: (UIEvent *) event {if (touchInCar) {UITouch touch = [chạm vào bất kỳ một đối tượng nào]; tự. xe hơi. center = [touch locationInView: tự. xem];} khác [siêu touchesMoved: chạm vớiEvent: sự kiện];}
Nếu chạm đầu tiên ở chế độ xem Xe (touchInCar là YES), bạn chỉ định thuộc tính trung tâm của ô tô cho tọa độ cảm ứng. Khi bạn gán một giá trị mới cho thuộc tính trung tâm, vị trí của chế độ xem sẽ được thay đổi ngay lập tức. Nếu không, bạn bỏ qua liên lạc và chuyển tiếp các tin nhắn lên dây đáp ứng.
Thật thú vị khi quan sát thấy rằng khi bạn đặt xe bên cạnh nút, nó sẽ di chuyển dưới nút đó khi bạn chạm vào nút Kiểm tra. Tính năng này minh họa cấu trúc phụ.
Thử nghiệm với việc di chuyển chiếc xe xung quanh và sau đó sử dụng nút Kiểm tra. Nếu có bất cứ điều gì sai trái với các công thức của bạn để định vị chiếc xe trong Thử nghiệm, bạn sẽ nhìn thấy nó khi chiếc xe bắt đầu từ một nơi khác.
