2015-01-05 4 views
9

UITextField का उपयोग कर संपादन और संपादन मोड नहीं के बीच अलग अलग खड़ी पाठ संरेखण है संपादन के बीच अलग अलग खड़ी पाठ संरेखण है और मोड संपादन नहीं जब Helvetica Neue लाइट 17 की तरह कुछ फोंट का उपयोग कर:UITextField आईओएस में 8.1 जब कुछ फोंट आईओएस 8.1.X में

UITextField bug example

मैं एक नमूना परियोजना here है।

क्या कोई कामकाज है कि मुझे कस्टम टेक्स्ट फ़ील्ड बनाने की आवश्यकता नहीं है? मुख्य समस्या यह है कि गतिशील प्रकार का उपयोग करते समय, फ़ॉन्ट रनटाइम में बदल सकता है।

वैसे भी मैंने एक रडार rdar://19374610 खोला।

+0

मुझे इस मुद्दे का सामना करना याद है और मुझे लगता है कि यह लंबवत स्थिति से संबंधित फ़ॉन्ट्स पर एक निश्चित संपत्ति से संबंधित है जो कुछ स्थितियों पर नजरअंदाज है, न कि दूसरों पर। इस मामले में संपादन के दौरान इसका एक अलग व्यवहार है और नहीं। एक त्वरित हैक के रूप में मैंने जो किया था, वह संपादन शुरू होने पर यूआईटीएक्स्टफाल्ड 1 या 2 पिक्सेल को दोबारा बदलना था, और संपादन समाप्त होने पर वापस स्थान पर था। – manecosta

+0

उस दृष्टिकोण के साथ समस्या यह है कि आप UITextField पर किसी भी सीमा या पृष्ठभूमि का उपयोग नहीं कर सकते हैं जो यह स्पष्ट करेगा कि आप पूरी चीज को दोबारा बदल रहे हैं, अर्थात् देशी गोलाकार सीमा ऐसा लगता है कि आप इसका उपयोग कर रहे हैं। – manecosta

+0

इस लड़के को एक ही समस्या का सामना करना पड़ रहा था और यह उसी निष्कर्ष पर आया जैसा मैंने उस समय किया था। http://stackoverflow.com/questions/9674566/text-in-uitextfield-moves-up-after-editing-center-while-editing – manecosta

उत्तर

-1

यह बग फ़ॉन्ट निर्भर है इसलिए मैं ऐसे समाधान के साथ जाऊंगा जो इसे क्षतिपूर्ति करने के लिए जिम्मेदार स्ट्रिंग की शैली निर्धारित करता है।

Helvetica Neue लाइट और आकार 17 के साथ पहले पाठ फ़ील्ड के लिए इसे ठीक करने के एक उदाहरण:

दृश्य नियंत्रक मान लीजिए firstTextField

- (void)viewDidLoad { 
[super viewDidLoad]; 
// Do any additional setup after loading the view, typically from a nib. 
NSDictionary *style = @{ 
     NSFontAttributeName : [UIFont fontWithName:@"HelveticaNeue-Light" 
               size:17], 
     NSParagraphStyleAttributeName : [NSParagraphStyle defaultParagraphStyle], 
     NSBaselineOffsetAttributeName: @(0.4) 
}; 
_firstTextField.attributedText = [[NSAttributedString alloc] initWithString:_firstTextField.text 
                   attributes:style]; 

} 
-(void)textFieldDidBeginEditing:(UITextField *)textField { 
NSDictionary *style = @{ 
     NSFontAttributeName : [UIFont fontWithName:@"HelveticaNeue-Light" 
               size:17], 
     NSParagraphStyleAttributeName : [NSParagraphStyle defaultParagraphStyle], 
     NSBaselineOffsetAttributeName: @(0.0) 

}; 
[_firstTextField setTypingAttributes: style]; 
} 

के प्रतिनिधि है महत्वपूर्ण हिस्सा है जब आप सेट NSBaselineAlignment जब आप टेक्स्टफिल्ड को तब संपादित करते हैं जब आप इसे संपादित कर रहे हों। इसके अलावा मैंने जांच की कि जब फ़ॉन्ट डबल आकार होता है (टेक्स्टफिल्ड काफी बड़ा होता है) और एनएसबीसलाइन ऑफसेट अभी भी कूद प्रभाव से बचने के लिए समान है।

+0

मुझे लगता है कि यह बग फ़ॉन्ट निर्भर है, यहां मुद्दा यह है कि चूंकि मैं गतिशील प्रकार का उपयोग कर रहा हूं, फ़ॉन्ट रनटाइम पर बदल सकता है। तो इस समाधान, विशिष्ट मामलों के लिए काम के बावजूद, सवाल का जवाब न दें। मैं इसे और स्पष्ट करने के लिए प्रश्न को फिर से लिखूंगा। –

3

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

कारण पाठ ऊपर ले जाता है, क्योंकि यह दो पूरी तरह से अलग अलग तरीकों से प्रदान की गई है: गैर संपादन संस्करण -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 संस्करण का उपयोग करना चाहिए।

+0

** संपादित करें: ** आईबी के माध्यम से निर्मित बोर्डर्ड टेक्स्ट फ़ील्ड और बनाए गए लोगों के लिए जोड़ा गया फिक्स। –

+0

मैं पुष्टि कर सकता हूं कि यह आईओएस 8.x समस्या है। आईओएस 9.0.2 में नहीं हो रहा है। –

+1

@ Otávio यह वास्तव में है। इसलिए 'if (UIDevice.currentDevice.systemVersion.integerValue! = 8) 'जांचें। –

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