2011-12-30 18 views
7

से चयनित टेक्स्ट फ्रेम कैसे प्राप्त कर सकता हूं, मैं में किसी चयनित टेक्स्ट के रेक्ट से UIPopoverController प्रदर्शित करने का प्रयास कर रहा हूं, मैं चयनित टेक्स्ट CGRect कैसे प्राप्त कर सकता हूं?मैं UITextView

धन्यवाद!

+0

यदि यह प्रश्न मुझे लगता है कि यह क्या है, तो शीर्षक में यूआईपीओपीओवर नियंत्रक शायद भ्रामक है? आप टेक्स्ट चयन से CGPoint प्राप्त करना चाहते हैं, यह UIPopoverController के लिए कुछ खास नहीं है, है ना? – barley

+0

शीर्षक को फिक्स्ड करें क्योंकि आपका सुझाव वैध @barley है। – Till

उत्तर

33

मुझे लगता है कि [UITextInput selectedTextRange] और [UITextInput caretRectForPosition:] वह है जिसे आप ढूंढ रहे हैं।

[UITextInput selectedTextRange] चरित्र में चयनित श्रेणी रिटर्न

[UITextInput caretRectForPosition:] रिटर्न इस इनपुट में चरित्र रेंज के CGRect

UITextViewUITextInput (आईओएस 5 के बाद से) के अनुरूप है, इसलिए आप इन विधियों का उपयोग अपने UITextView उदाहरण के लिए कर सकते हैं।

यह ऐसा कुछ होने जा रहा है।

UITextRange * selectionRange = [textView selectedTextRange]; 
CGRect selectionStartRect = [textView caretRectForPosition:selectionRange.start]; 
CGRect selectionEndRect = [textView caretRectForPosition:selectionRange.end]; 
CGPoint selectionCenterPoint = (CGPoint){(selectionStartRect.origin.x + selectionEndRect.origin.x)/2,(selectionStartRect.origin.y + selectionStartRect.size.height/2)}; 

संपादित करें: चूंकि नमूना कोड प्राप्त करने में थोड़ा मुश्किल हो गया है, इसलिए मैंने पूरक के लिए एक छवि जोड़ा।

An image that illustrates what local variables represent

+0

छोटी समस्या, आप इसे केंद्र बिंदु कहते हैं लेकिन आप वास्तव में नीचे दाएं बिंदु की गणना कर रहे हैं। – Till

+0

@ तब तक, मैंने मूल रूप से सोचा [UITextInput caretRectForPosition:] UITextRange इनपुट के रूप में ले जाएगा, लेकिन (जैसा कि नाम बताता है) यह वास्तव में UITextPosition लेता है। मैंने नमूना कोड तय किया, और मुझे लगता है कि यह अब और अधिक सटीक है हालांकि थोड़ा मुश्किल है। और संस्करण के लिए धन्यवाद! – barley

+0

आपके केंद्र की गणना में अभी भी एक छोटी सी समस्या है: डी ... एक्स-समन्वय को दोबारा जांचें, ब्रैकेट गलत तरीके से केंद्र को कैल्क करने के लिए सेट हैं। – Till

19

कुछ स्थितियों में, जहां जौ का जवाब वास्तव में चयन के केंद्र नहीं देंगे कर रहे हैं। उदाहरण के लिए:

Screenshot showing an example of where using the caret rects would not be accurate

इस मामले में आप कॉपी/पेस्ट मेनू चयन, जो पाठ क्षेत्र के पूरे चौड़ाई तक फैली के केंद्र में प्रदर्शित कर रहा है देख सकते हैं। लेकिन दो कैरेट रीक्ट्स के केंद्र की गणना करने से दाईं ओर एक स्थिति अधिक होगी।

आप एक और अधिक सटीक selectionRectsForRange:

UITextRange *selectionRange = [textView selectedTextRange]; 
NSArray *selectionRects = [self.textView selectionRectsForRange:selectionRange]; 
CGRect completeRect = CGRectNull; 
for (UITextSelectionRect *selectionRect in selectionRects) { 
    if (CGRectIsNull(completeRect)) { 
     completeRect = selectionRect.rect; 
    } else completeRect = CGRectUnion(completeRect,selectionRect.rect); 
} 

यह भी स्पष्ट लायक है कि अगर आप अभी भी आईओएस 4 समर्थन कर रहे हैं और इन उत्तरों में से किसी का उपयोग कर, आप सुनिश्चित करें कि इन तरीके हैं बनाने के लिए की आवश्यकता होगी का उपयोग कर परिणाम प्राप्त कर सकते हैं उन्हें कॉल करने से पहले समर्थित: if ([textView respondsToSelector:@selector(selectedTextRange)]) { …

+0

परफेक्ट, एक आकर्षण की तरह काम किया – aryaxt

+2

आपको वास्तव में CGRectIsNull की जांच की आवश्यकता नहीं है क्योंकि CGRectUnion पहले से ही इसे संभालता है। CGRectUnion के लिए प्रलेखन के अनुसार: "अगर आयताकारों में से कोई एक शून्य आयताकार है, तो अन्य आयताकार की एक प्रति वापस आती है" –