2009-05-26 3 views
13

पर स्वत: सुधार दृश्य स्थिति को नियंत्रित करना UITextField में टाइप करते समय ऑटो सही दृश्य की स्थिति को नियंत्रित करने का कोई तरीका है?आईफोन

डिफ़ॉल्ट रूप से यह हमेशा टेक्स्ट फ़ील्ड के नीचे दिखाई देता प्रतीत होता है। हालांकि ऐप्पल के ऐप्स जैसे एसएमएस में यह कभी-कभी टेक्स्ट फ़ील्ड के ऊपर दिखाई देता है।

कुंजीपटल के ठीक ऊपर संरेखित टेक्स्ट फ़ील्ड के लिए कीबोर्ड द्वारा ऑटो सही अवरुद्ध किया गया है और प्रयोग योग्य नहीं है।

+0

टक्कर! 1 साल के बाद कोई जवाब? –

+0

तकनीकी रूप से यह संभव नहीं है, और कोई सार्वजनिक एपीआई नहीं है जो ऐसा करने की अनुमति देगी। हालांकि, कोई सुधार पॉपअप की स्थिति को संशोधित कर सकता है: पॉपअप टेक्स्ट क्षेत्र का एक सबव्यूव है, और इसलिए सबव्यू के माध्यम से पुनरावृत्ति करके पाया जा सकता है। आप इसे मूल स्थिति पा सकते हैं और इसे कहीं भी ले जा सकते हैं। इस तर्क को एक विधि में रखें और इसे हर बार टेक्स्ट फ़ील्ड के "लेआउट सबव्यूव्यूज़" कहा जाता है ... मुझे अभी तक एक क्लीनर समाधान नहीं देखा गया है – Nick

उत्तर

1

ऑटो सुधार प्रॉम्प्ट की स्थिति पहले Rect ... UITextInput प्रोटोकॉल की विधि द्वारा निर्धारित की जाती है। दुर्भाग्य से UITextField इस प्रोटोकॉल के लिए प्रतिनिधि के रूप में एक निजी वर्ग का उपयोग करता है ताकि आप इसे उपclass और ओवरराइड नहीं कर सकें।

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

लंबी कहानी छोटी: यह बहुत अधिक परेशानी है।

0

एक उत्तर यह मेरे लिए काम करता है टेक्स्टव्यू/टेक्स्टव्यू के setInputAccessoryView विधि का उपयोग करना है। मेरे पास एक टूलबार है जिसमें टेक्स्ट व्यू है। यदि मैंने टूलबार को इनपुटफील्ड के इनपुट एक्सेसरीव्यूव्यू के रूप में सेट किया है, और टूलबार की कोई क्लिप नहीं है, तो मुझे नहीं पता कि क्यों, लेकिन गुब्बारा कीबोर्ड से ऊपर दिखाई देता है

+0

क्या आप यह पता लगाने में सक्षम हैं कि इसे कैसे दिखाया जाए ... फ़ील्ड के ऊपर नीचे के बजाय संपादित किया जा रहा है? धन्यवाद! –

0

यहां निजी एपीआई का उपयोग करने का एक समाधान है सार्वजनिक एपीआई का उपयोग करके ऐसा करने के कोई तरीके नहीं हैं।

  • निजी UITextEffectsWindow विंडो ढूंढने और इसके फ्रेम को समझने के लिए एप्लिकेशन के विन्डोज़ संपत्ति के माध्यम से खोज करें। यह कुंजीपटल
  • निजी UIAutocorrectInlinePrompt दृश्य खोजने के लिए टेक्स्ट व्यू के सबव्यू के माध्यम से खोज करें। यह स्वत: सुधार बुलबुला है।
  • उस सबव्यू को एक अलग रैपर व्यू (टेक्स्टव्यू में जोड़ा गया) में ले जाएं और उसके बाद उस रैपर दृश्य को स्थानांतरित करें ताकि यह ऊपर उल्लिखित कीबोर्ड विंडो से ऊपर हो।

swizzled layoutSubViews का उपयोग करना,

- (void) moveSpellingCorrection { 
for (UIView *view in self.subviews) 
{ 
    if ([[[view class] description] isEqualToString:@"UIAutocorrectInlinePrompt"]) 
    { 
     UIView *correctionShadowView = nil; // [view correctionShadowView]; 

     for (UIView *subview in view.subviews) 
     { 
      if ([[[subview class] description] isEqualToString:@"UIAutocorrectShadowView"]) 
      { 
       correctionShadowView = subview; 
       break; 
      } 
     } 

     if (correctionShadowView) 
     { 
      UIView *typedTextView = nil; //[view typedTextView]; 
      UIView *correctionView = nil; //[view correctionView]; 

      for (UIView *subview in view.subviews) 
      { 
       if ([[[subview class] description] isEqualToString:@"UIAutocorrectTextView"]) 
       { 
        if (CGRectContainsRect(correctionShadowView.frame,subview.frame)) 
        { 
         correctionView = subview; 
        } 
        else 
        { 
         typedTextView = subview; 
        } 
       } 

      } 
      if (correctionView && typedTextView) 
      { 

       CGRect textRect = [typedTextView frame]; 
       CGRect correctionRect = [correctionView frame]; 
       if (textRect.origin.y < correctionRect.origin.y) 
       { 
        CGAffineTransform moveUp = CGAffineTransformMakeTranslation(0,-50.0); 
        [correctionView setTransform: moveUp]; 
        [correctionShadowView setTransform: moveUp]; 

        CGRect windowPos = [self convertRect: view.frame toView: nil ]; 
        [view removeFromSuperview]; 
        [self.window addSubview: view]; 
        view.frame = windowPos; 
       } 

      } 
     } 

    } 

} 

}

अधिक जानकारी के check लिए।