बस एक ही मुद्दे पर ठोकर खाई और थोड़ा 'डीबग' करने का फैसला किया। असल में मैंने बस विभिन्न फ़ॉन्ट्स (टोपी ऊंचाई, बिंदु आकार, पसंदीदा ऊंचाई, उपलब्ध ऊंचाई, पाठ को स्थानांतरित करने की दूरी) के लिए मूल्यों की योजना बनाई और एक पैटर्न देखा।
कारण पाठ ऊपर ले जाता है, क्योंकि यह दो पूरी तरह से अलग अलग तरीकों से प्रदान की गई है: गैर संपादन संस्करण -drawRect:
का उपयोग कर प्रदान की गई है (आप भी हुक ओवरराइड कर सकते हैं), संपादन संस्करण के द्वारा एक UIFieldEditor
तथाकथित प्रदान की गई है। यह ceil
टेक्स्ट ऊंचाई पर दिखाई देता है चाहे आप रेटिना डिवाइस पर हों या नहीं और बाद में इसे केंद्रित करते हैं। रेटिना उपकरणों पर हालांकि, आपको पिक्सल पर संरेखित करने के लिए हमेशा ceil(scalar * scale)/scale
होना चाहिए। इसलिए आईओएस आवश्यकतानुसार अधिक टेक्स्ट ऊंचाई मानता है, और इसे केंद्रित रखने के लिए इसे थोड़ा आगे बढ़ाता है। काफी हद तक, स्थिर पाठ का प्रतिपादन और UIFieldEditor
भिन्न है।
समस्या को ठीक करने के लिए, UITextField
उपclass और -editingRectForBounds:
ओवरराइड करें। यहां आप गैर-संपादन-रेक्ट ('टेक्स्ट रेक्ट') लेना चाहते हैं और ऐप्पल अग्रिम में प्रदर्शन करने जा रहा है।
- (CGRect)editingRectForBounds:(CGRect)bounds
{
if (UIDevice.currentDevice.systemVersion.integerValue != 8) return [self textRectForBounds:bounds];
CGFloat const scale = UIScreen.mainScreen.scale;
CGFloat const preferred = self.attributedText.size.height;
CGFloat const delta = ceil(preferred) - preferred;
CGFloat const adjustment = floor(delta * scale)/scale;
CGRect const textRect = [self textRectForBounds:bounds];
CGRect const editingRect = CGRectOffset(textRect, 0.0, adjustment);
return editingRect;
}
संपादित करें: मैं सिर्फ 8.0 सहित पुराने OS संस्करण, पर कोड का परीक्षण किया। आईओएस 7.x पर, सबकुछ ठीक लगता है, आईओएस 8.0 में पहले से ही बग है। हम भविष्य की भविष्यवाणी नहीं कर सकते हैं, इसलिए अब मैं केवल आईओएस 8.x के लिए फिक्स शामिल करूंगा, उम्मीद है कि ऐप्पल आईओएस 9 में समस्या को हल करता है।
एक और संपादित करें: इस कोड संपादन पाठ अपनी स्थिर समकक्ष के रूप में एक ही स्थान पर दिखाई देता है।यदि आप उन्हें अलग से नियंत्रित करना चाहते हैं (जो ऐप्पल सोचता है, क्योंकि वे -textRectForBounds:
और -editingRectForBounds:
दोनों प्रदान करते हैं), तो आप [self textRectForBounds:bounds]
को [super editingRectForBounds:bounds]
के साथ प्रतिस्थापित करना चाहेंगे। यदि आप स्विजलिंग का उपयोग करके इस श्रेणी को एक श्रेणी में कार्यान्वित करना चाहते हैं, तो आपको निश्चित रूप से super
संस्करण का उपयोग करना चाहिए।
स्रोत
2015-06-05 21:39:00
मुझे इस मुद्दे का सामना करना याद है और मुझे लगता है कि यह लंबवत स्थिति से संबंधित फ़ॉन्ट्स पर एक निश्चित संपत्ति से संबंधित है जो कुछ स्थितियों पर नजरअंदाज है, न कि दूसरों पर। इस मामले में संपादन के दौरान इसका एक अलग व्यवहार है और नहीं। एक त्वरित हैक के रूप में मैंने जो किया था, वह संपादन शुरू होने पर यूआईटीएक्स्टफाल्ड 1 या 2 पिक्सेल को दोबारा बदलना था, और संपादन समाप्त होने पर वापस स्थान पर था। – manecosta
उस दृष्टिकोण के साथ समस्या यह है कि आप UITextField पर किसी भी सीमा या पृष्ठभूमि का उपयोग नहीं कर सकते हैं जो यह स्पष्ट करेगा कि आप पूरी चीज को दोबारा बदल रहे हैं, अर्थात् देशी गोलाकार सीमा ऐसा लगता है कि आप इसका उपयोग कर रहे हैं। – manecosta
इस लड़के को एक ही समस्या का सामना करना पड़ रहा था और यह उसी निष्कर्ष पर आया जैसा मैंने उस समय किया था। http://stackoverflow.com/questions/9674566/text-in-uitextfield-moves-up-after-editing-center-while-editing – manecosta