2015-11-23 18 views
5

मैं 6 लाइनों के उच्च विवरण लेबल को लागू करने की कोशिश कर रहा हूं और मैं इसे ध्यान केंद्रित करना चाहता हूं। आदर्श रूप से इसका मतलब है कि एक कस्टम घटक बनाने के लिए यूलाबेल वर्ग का विस्तार करना। मैंने कोशिश की कि canBecomeFocused और didUpdateFocusInContext लागू करके मेरा यूआईएलएबल कोई फोकस नहीं लग रहा है।यूलाबेल फोकस करने योग्य और टैप करने योग्य (टीवीओएस)

मैंने यूआईएलएबल को UIButton के साथ बदलने की भी कोशिश की, लेकिन बटन इस तरह की चीज़ के लिए वास्तव में अनुकूलित नहीं हैं। इसके अलावा इसका मतलब यह होगा कि मुझे buttonType को कस्टम से सादे पर ध्यान केंद्रित करने की आवश्यकता होगी .. और बटन टाइप केवल एकमात्र संपत्ति प्रतीत होता है।

असल में मैं ऐप्पल द्वारा ऐप्पल टीवी मूवीज़ ऐप में लागू एक ही टेक्स्ट लेबल रखना चाहता हूं। फिल्म विवरण के लिए उनके पास एक टेक्स्ट लेबल है जो टेक्स्ट की कुछ पंक्तियां और "अधिक" प्रदर्शित करता है। ध्यान केंद्रित करते समय यह एक बटन (चारों ओर छाया) जैसा दिखता है और पृष्ठभूमि रंग बदल जाता है। टैप किए जाने पर - यह पूरे मूवी विवरण के साथ एक मोडल विंडो खोलता है।

enter image description here

कोई सुझाव? या शायद किसी ने टीवीओएस के लिए इस कस्टम नियंत्रण को पहले ही लागू कर दिया है? या घटना बेहतर - ऐप्पल से एक घटक है जो ऐसा करता है और मुझे कुछ याद आ रहा है।

पुनश्च: स्विफ्ट समाधान स्वागत :)

उत्तर

5

ठीक हो सकता है, मेरे अपने प्रश्न :)

तो ऐसा लगता है कि कुछ कुछ दृश्यों आउट-ऑफ-द-बॉक्स tvOS पर "फ़ोकस करने योग्य" कर रहे हैं का जवाब दे, और अन्य को ऐसा करने का निर्देश दिया जाना चाहिए।

मैं अंत में UITextView का उपयोग कर समाप्त हुआ, जिसमें selectable संपत्ति है, लेकिन डिफ़ॉल्ट रूप से इन फोकस करने योग्य दृश्यों में से कोई एक नहीं है। TextView का संपादन UILabel जैसा दिखने के लिए अक्षम होना चाहिए। इसके अलावा, वर्तमान में एक बग है जो आपको इंटरफेस बिल्डर से selectable संपत्ति का उपयोग करने से रोकती है लेकिन कोड से काम करती है।

स्वाभाविक रूप से, canBecomeFocused() और didUpdateFocusInContext भी लागू किया जाना था। आपको UIViewController पास करने की भी आवश्यकता होगी क्योंकि UITextView एक मोडल व्यू कंट्रोलर प्रस्तुत करने में सक्षम नहीं है। मैं जो बना रहा हूं वह है।

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

इस उत्तर के लिए धन्यवाद, मैंने इसे अपनी परियोजना के लिए थोड़ा सा संशोधित किया। https://gist.github.com/Cedrick84/8922a0af730c39c05794 – Cedrick

+0

क्या हाल ही में टीवीओएस के साथ कुछ भी बदल गया है जिससे यह काम नहीं करेगा? मैं अभी भी ध्यान केंद्रित करने के लिए टेक्स्टव्यू नहीं प्राप्त कर सकता हूं इससे कोई फर्क नहीं पड़ता कि मैं क्या प्रयास करता हूं। मैं कर्नेल पैनिक और @ सेड्रिक द्वारा दोनों मार्गों को नीचे चला गया हूं। –

+0

हाँ, मैंने UIImageView के लिए कुछ ऐसा ही बनाया है और मैं इसे केंद्रित करने में सक्षम था (भले ही यह किसी तालिका या संग्रहदृश्य के अंदर न हो) लेकिन मुझे टेक्स्टव्यू को काम करने के लिए नहीं मिला। कोई विचार नहीं है कि अभी क्यों मैंने – c0d3Junk13

1

सिर्फ एक सेल के साथ एक संग्रह दृश्य का उपयोग करें और जोड़ने के सेल को बदलने और सेल करने के लिए जब फोकस चाल didUpdateFocusInContext में सेल पृष्ठभूमि रंग बदल जाते हैं।

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) 
} 

एक अतिरिक्त कदम आप का उपयोग है कि सेल के पीछे दृश्य प्रभाव देखने के लिए यदि आप iTunes की तरह पृष्ठभूमि के रूप में छवि का उपयोग कर रहे हैं छवि के रंग निकालने के लिए कोशिश करते हैं और हो सकता है के रूप में।

इसके अलावा, आप वीडियो नियंत्रक में collectionView को बदलने यह ध्यान में की तरह लग रहे बनाने के लिए

-1

आप सिस्टम बटन का उपयोग कर सकते हैं और एक छवि है कि रंग आप चाहते हैं जिसमें स्टोरीबोर्ड में पृष्ठभूमि छवि सेट लागू कर सकते हैं

+0

से ऊपर वर्णित सबकुछ किया है, वह UILabel या UITextView का उपयोग करना चाहता है। सिस्टम बटन का उपयोग करना एक भयानक समाधान है। –

संबंधित मुद्दे