2015-11-23 13 views
5

Tôi đang cố gắng triển khai 6 dòng nhãn mô tả cao và tôi muốn nó có thể lấy nét được. Lý tưởng nhất có nghĩa là mở rộng lớp UILabel để tạo thành phần tùy chỉnh. Tôi đã thử điều đó bằng cách triển khai canBecomeFocuseddidUpdateFocusInContext nhưng UILabel của tôi dường như không tập trung.Đặt UILabel có thể lấy nét và có thể nhấn được (tvOS)

Tôi cũng đã thử thay thế UILabel bằng UIButton, nhưng các nút không thực sự được tối ưu hóa cho loại điều này. Điều đó cũng có nghĩa là tôi cần phải thay đổi buttonType trên tiêu điểm từ tùy chỉnh thành đồng bằng .. và buttonType có vẻ là thuộc tính chỉ sẵn sàng.

Trong thực tế, tôi muốn có cùng một nhãn văn bản chính xác do Apple triển khai trong ứng dụng Apple TV Phim. Đối với mô tả phim, chúng có nhãn văn bản hiển thị một vài dòng văn bản và "dòng chữ" hơn. Khi lấy nét, nó trông giống như một nút (đổ bóng xung quanh) và thay đổi màu nền. Khi khai thác - nó sẽ mở ra một cửa sổ phương thức với toàn bộ mô tả phim.

enter image description here

Mọi đề xuất? Hoặc có thể ai đó đã triển khai điều khiển tùy chỉnh này cho tvOS? Hoặc sự kiện tốt hơn - có một thành phần từ Apple thực hiện điều này và tôi đang thiếu thứ gì đó.

PS: Swift giải pháp sẽ được hoan nghênh :)

Trả lời

5

Ok, trả lời câu hỏi của riêng tôi :)

Vì vậy, có vẻ như một số một số quan điểm là "tiêu điểm" trên tvOS out-of-the-box, và người khác phải được hướng dẫn làm như vậy.

Cuối cùng tôi đã sử dụng UITextView, trong đó có thuộc tính selectable, nhưng nếu không phải là một trong các chế độ xem có thể lấy tiêu điểm này theo mặc định. Chỉnh sửa TextView phải bị vô hiệu hóa để làm cho nó trông giống như UILabel. Ngoài ra, hiện tại có một lỗi ngăn bạn sử dụng thuộc tính selectable từ Trình tạo giao diện nhưng hoạt động từ mã.

Đương nhiên, canBecomeFocused()didUpdateFocusInContext cũng phải được triển khai. Bạn cũng sẽ cần phải vượt qua một UIViewControllerUITextView không có khả năng trình bày bộ điều khiển chế độ xem phương thức. Dưới đây là những gì tôi đã tạo ra.

class FocusableText: UITextView { 

    var data: String? 
    var parentView: UIViewController? 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     let tap = UITapGestureRecognizer(target: self, action: "tapped:") 
     tap.allowedPressTypes = [NSNumber(integer: UIPressType.Select.rawValue)] 
     self.addGestureRecognizer(tap) 
    } 

    func tapped(gesture: UITapGestureRecognizer) { 
     let storyboard = UIStoryboard(name: "Main", bundle: nil) 
     if let descriptionView = storyboard.instantiateViewControllerWithIdentifier("descriptionView") as? DescriptionViewController { 
      if let view = parentView { 
       if let show = show { 
        descriptionView.descriptionText = self.data 
        view.modalPresentationStyle = UIModalPresentationStyle.OverFullScreen 
        view.presentViewController(descriptionView, animated: true, completion: nil) 
       } 
      } 
     } 
    } 

    override func canBecomeFocused() -> Bool { 
     return true 
    } 

    override func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) { 

     if context.nextFocusedView == self { 
      coordinator.addCoordinatedAnimations({() -> Void in 
       self.layer.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.2).CGColor 
      }, completion: nil) 
     } else if context.previouslyFocusedView == self { 
      coordinator.addCoordinatedAnimations({() -> Void in 
       self.layer.backgroundColor = UIColor.clearColor().CGColor 
      }, completion: nil) 
     } 
    } 

} 
+0

Cảm ơn câu trả lời này, tôi đã sửa đổi nó một chút cho dự án của tôi. https://gist.github.com/Cedrick84/8922a0af730c39c05794 – Cedrick

+0

Có gì thay đổi với tvOS gần đây và điều này có thể khiến việc này không hoạt động không? Tôi vẫn không thể có được một TextView để lấy tiêu điểm bất kể tôi cố gắng làm gì. Tôi đã đi xuống cả hai tuyến đường bằng kernelpanic và @Cedrick. –

+0

Vâng, tôi đã làm một cái gì đó tương tự cho UIImageView và tôi đã có thể làm cho nó tập trung (mặc dù nó không phải bên trong một bảng hoặc collectionview) nhưng tôi không thể có được TextView để làm việc. Không có ý tưởng tại sao ngay bây giờ như tôi đã làm tất cả mọi thứ được đề cập ở trên – c0d3Junk13

1

Sử dụng chế độ xem bộ sưu tập chỉ với một ô và thêm biến đổi vào ô và thay đổi màu nền ô trong doUpdateFocusInContext khi tiêu điểm di chuyển đến ô.

override func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) { 
    coordinator.addCoordinatedAnimations({ 
     if self.focused { 
      self.transform = CGAffineTransformMakeScale(1.01, 1.01) 
      self.backgroundColor = UIColor.whiteColor() 
      self.textLabel.textColor = .blackColor() 
     } 
     else { 
      self.transform = CGAffineTransformMakeScale(1, 1) 
      self.backgroundColor = UIColor.clearColor() 
      self.textLabel.textColor = .whiteColor() 
     } 
     }, completion: nil) 
} 

Là bước bổ sung bạn có thể thử trích xuất màu của hình ảnh nếu bạn đang sử dụng hình ảnh làm nền như iTunes và sử dụng hình ảnh đó cho chế độ xem hiệu ứng hình ảnh phía sau ô.

Ngoài ra bạn có thể áp dụng biến đổi đến collectionView trong bộ điều khiển video để làm cho nó trông giống như trong tập trung

-1

Bạn có thể sử dụng nút hệ thống, và thiết lập các hình nền trong kịch bản cho một hình ảnh có chứa các màu sắc mà bạn muốn

+0

Ông muốn sử dụng UILabel hoặc UITextView. Sử dụng nút hệ thống là một giải pháp khủng khiếp. –

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