2015-09-11 17 views
8

Làm cách nào để nhận các lần chạm bằng TVOS với trình mô phỏng? Chúng ta cần biết vị trí cảm ứng. UIPress - không có nó!Làm cách nào để nhận các lần chạm bằng tvOS?

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event { 
    // Never called 
} 

-(void)pressesEnded:(NSSet<UIPress *> *)presses withEvent:(nullable UIPressesEvent *)event { 
    // Works fine! 
} 

Trả lời

1

Tôi nghĩ rằng nó nên được nhấnBắt đầu thay vì chạm vàoBegan.

(void)pressesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event 
+0

bạn ngay! pressan Began, Cansel, Ended - Tất cả đều ổn. Chúng ta cần một loại Touch - với vị trí của X và Y trên bảng điều khiển cảm ứng! – user2545883

+0

@ user2545883 vui lòng đánh dấu đây là câu trả lời đúng nếu nó giải quyết được vấn đề của bạn để những người khác có cùng vấn đề sẽ biết đây là giải pháp – Chris

0

Lưu ý tvOS không có khái niệm "chạm" như khi chạm vào màn hình.

Cách chính thức để xử lý "nhấn" đang sử dụng UITapGestureRecognizer. Và đó là khi người dùng chạm/nhấp vào điều khiển từ xa khi một mục ở trạng thái lấy nét.

Sau đây là cách tôi đang làm nó làm việc với một UICollectionView:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 

    if let cell = collectionView.dequeueReusableCellWithReuseIdentifier("MovieCell", forIndexPath: indexPath) as? MovieCell { 

     let movie = movies[indexPath.row] 
     cell.configureCell(movie) 

     if cell.gestureRecognizers?.count == nil { 
      let tap = UITapGestureRecognizer(target: self, action: "tapped:") 
      tap.allowedPressTypes = [NSNumber(integer: UIPressType.Select.rawValue)] 
      cell.addGestureRecognizer(tap) 
     } 

     return cell 

    } else { 
     return MovieCell() 
    } 
} 

func tapped(gesture: UITapGestureRecognizer) { 

    if let cell = gesture.view as? MovieCell { 
     //Load the next view controller and pass in the movie 
     print("Tap detected...") 
    } 
} 

Bạn có thể lấy vị trí của vòi nước từ UITapGestureRecognizer đó được thông qua tại trên chức năng xử lý.

Xem thêm hướng dẫn này trên Apple TV: https://www.youtube.com/watch?v=XmLdEcq-QNI

+0

Bạn không cần có trình nhận dạng cử chỉ nhấn trong trường hợp này. UICollectionView bình thường didSelect ... các phương thức ủy nhiệm sẽ hoạt động giống như trên iOS. – lemnar

+0

lemnar - chúng không. Đã dành một vài giờ cố gắng để có được điều đó để làm việc cho đến khi tôi đọc các tài liệu. Trạng thái lấy nét và vòi điều khiển sau đó không có ngữ cảnh của indexPath, vì vậy bạn phải sử dụng cử chỉ nhấn. – Spentak

+0

Làm thế nào để bạn phân biệt các cú nhấn từ các nhấp chuột? – David

10

Presses có liên quan đến các nút vật lý, giống như nút Menu. Một báo chí bắt đầu khi bạn bắt đầu giữ nút như vậy và nó kết thúc khi bạn dừng giữ nút. Không có bất kỳ vị trí nào liên quan đến màn hình được liên kết với báo chí.

Chạm trong tvOS tương tự như chạm trong iOS, nhưng có một điểm khác biệt quan trọng: chạm "gián tiếp", nghĩa là không có mối quan hệ vật lý giữa vị trí của ngón tay và vị trí trên màn hình.

Khi chạm bắt đầu, nó sẽ được chuyển đến chế độ xem được lấy nét và chạm sẽ được coi là đã bắt đầu ở giữa chế độ xem đó, bất kể vị trí tuyệt đối của ngón tay trên bề mặt cảm ứng. Khi di chuyển cảm ứng, vị trí tương đối của màn hình sẽ được cập nhật tương ứng.

Tôi không biết bất kỳ API nào cho phép bạn xác định vị trí tuyệt đối của ngón tay trên bề mặt cảm ứng.

Trong trường hợp của bạn, đặt chế độ trả lời của bạn ở chế độ xem tiêu điểm sẽ khiến thiết bị nhận sự kiện chạm.

+0

https://developer.apple.com/library/prerelease/tvos/documentation/General/Conceptual/AppleTV_PG/DetectingButtonPressesandGestures.html#//apple_ref/doc/uid/TP40015241-CH16-SW1 – Mark

+0

Thực ra bạn có thể nhận được giá trị tuyệt đối bởi đặt báo cáo của GCMicroGamepadAbsoluteDpadValues ​​thành YES.Vui lòng xem phần này: https://developer.apple.com/library/tvos/documentation/GameController/Reference/GCMicroGamepad_Ref/index.html#//apple_ref/occ/instp/GCMicroGamepad/reportsAbsoluteDpadValues ​​ –

+0

Điều này dành cho bộ điều khiển trò chơi chứ không phải cho điều khiển từ xa như tôi hiểu. –

0

Một cách dễ dàng để làm điều đó:

var tapGestureRecognizer: UITapGestureRecognizer! 

override func didMoveToView(view: SKView) { 

    tapGestureRecognizer = UITapGestureRecognizer.init(target: self, action: Selector("tapped:")) 
    self.view?.addGestureRecognizer(tapGestureRecognizer) 

} 

func tapped(sender: UITapGestureRecognizer) { 

    // do something 

} 

Hãy xem để kho của tôi: https://github.com/fredericdnddev/tvOS-UITapGestureRecognizer/blob/master/tvOS%20Game/GameScene.swift

+0

Câu hỏi được đánh dấu mục tiêu c, và đó là những gì user2545883 đang tìm kiếm. Đăng giải pháp nhanh chóng không hữu ích cho anh ta, cũng như những người khác như tôi đang tìm kiếm các ví dụ c mục tiêu. – seaders

+1

vấn đề với giải pháp này là đây là BÁO CHÍ không TAP. Câu hỏi đặt ra là lấy tọa độ của TAP! Nhấn không có tọa độ. Một trong những cách để có được tọa độ từ các điểm chạm trong TVOS là sử dụng UIPanGestureRecognizer. –

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