2014-09-30 4 views
8

आईओएस 8 पर स्विच करने के बाद, जब मैं कीबोर्ड संक्रमण के दौरान दृश्यों को स्थानांतरित करता हूं तो मुझे अजीब व्यवहार मिल रहा है। क्या कोई बता सकता है कि क्या हो रहा है?आईओएस 8: कीबोर्ड संक्रमण के दौरान चलती दृश्यों के साथ क्या चल रहा है?

समस्या का प्रदर्शन करने के लिए यहां एक न्यूनतम उदाहरण दिया गया है। मेरे पास UITextField और UIButton के साथ एक साधारण दृश्य है। फ़ंक्शन nudgeUp टेक्स्ट फ़ील्ड और बटन को 10 अंकों तक ले जाता है। यह buttonPressed कॉलबैक, या keyboardWillShow कॉलबैक द्वारा ट्रिगर किया गया है।

जब मैं बटन टैप करता हूं, तो कोड अपेक्षित कार्य करता है: buttonPressed कॉल nudgeUp और बटन और टेक्स्ट फ़ील्ड 10 अंकों तक कूदता है।

जब मैं टेक्स्ट फ़ील्ड टैप करता हूं, keyboardWillShownudgeUp पर कॉल करता है, लेकिन व्यवहार बहुत अलग है। बटन और टेक्स्ट फ़ील्ड तुरंत नीचे 10 अंक से कूदें, और उसके बाद कुंजीपटल स्वयं दिखाए जाने के बाद अपनी मूल स्थिति पर वापस स्लाइड करें।

ऐसा क्यों हो रहा है? आईओएस 8 में कीबोर्ड प्रस्तुति के दौरान मैं एनिमेशन के नियंत्रण कैसे प्राप्त कर सकता हूं?

#import "ViewController.h" 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWillShow:) 
               name:UIKeyboardWillShowNotification 
               object:nil]; 

} 

- (void)keyboardWillShow:(NSNotification *)notification 
{ 
    // Called when the keyboard appears. 
    [self nudgeUp]; 
} 

- (IBAction)buttonPressed:(id)sender { 
    [self nudgeUp]; 
} 

- (void)nudgeUp 
{ 
    CGRect newTextFieldFrame = self.textField.frame; 
    newTextFieldFrame.origin.y -= 10; 
    self.textField.frame = newTextFieldFrame; 

    CGRect newButtonFrame = self.button.frame; 
    newButtonFrame.origin.y -= 10; 
    self.button.frame = newButtonFrame; 
} 
@end 
+0

मैं इस सवाल क्योंकि मैं देख रहा हूँ कि UIKeyboardWillShowNotification भी तैनात किया जा रहा कभी नहीं किया गया है पाया। (जैसा कि, addObserver कॉल में संदर्भित चयनकर्ता के भीतर एक ब्रेकपॉइंट कभी हिट नहीं होता है!)। क्या आपने सत्यापित किया है कि अधिसूचना वास्तव में आपको पोस्ट की जा रही है? (मैं पूछता हूं क्योंकि हालांकि आईओएस 8 और ऑटो लेआउट सीखना हस्तक्षेप कर सकता है, मेरा ऐप पुराना है जो ऑटो लेआउट के साथ बनाया गया नहीं है)। – tobinjim

+0

अद्यतन: इसमें एक टेक्स्टफील्ड के साथ एक नया सिंगल-विंडो ऐप बनाया गया और ऑटोलाउट चेकबॉक्स के बावजूद अधिसूचना पोस्ट ... hmm) – tobinjim

+0

क्षमा करें, आपकी मदद नहीं कर सकता। अधिसूचना निश्चित रूप से मेरे कोड में पोस्ट की जा रही है। – Pitarou

उत्तर

8

यह ऑटोलाउट है। आईओएस 8 में कुछ बदल गया है और यदि आपके पास ऑटोलाउट सक्षम है तो आप फ्रेम या केंद्र बिंदुओं को और नहीं बदल सकते हैं। आपको अपनी बाधा (ऊर्ध्वाधर स्थान) का आउटलेट बनाना होगा और फ्रेम स्थिति बदलने के बजाए इसे तदनुसार अपडेट करना होगा। बाधाएं किसी अन्य यूई नियंत्रण की तरह हैं और आउटलेट हो सकती हैं। बाधा परिवर्तन एनिमेटेड किया जा सकता है।

उदाहरण:

[UIView animateWithDuration:[notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue] delay:0 options:[[[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue] animations:^{   
    self.bottomSpaceConstraint.constant = adjustmentedValue; 
    [self.view layoutIfNeeded];   
} completion:^(BOOL finished) { 
}]; 
+0

आपके अंतर्दृष्टिपूर्ण उत्तर के लिए बहुत धन्यवाद। मैंने इस सवाल पर 200 प्वाइंट बक्षीस रखा। काश मैं इसे आपको सम्मानित कर सकता था, लेकिन जब तक आपने उत्तर दिया कि बक्षीस की समयसीमा समाप्त हो चुकी है। – Pitarou

+0

यह वास्तव में मुश्किल है। मैंने इस समस्या पर दिन बिताए हैं, जानकारी के लिए धन्यवाद। –

0

आप UIKeyboardDidShowNotification का उपयोग करना चाहिए (आप will संस्करण का उपयोग कर रहे हैं) और सब कुछ आपकी अपेक्षा के अनुसार काम करेगा:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardDidShow:) 
               name:UIKeyboardDidShowNotification 
               object:nil]; 

} 

- (void)keyboardDidShow:(NSNotification *)notification 
{ 
    // Called when the keyboard finished showing up 
    [self nudgeUp]; 
} 

व्याख्या यह है कि UIKeyboardWillShowNotification के साथ फ्रेम बदल रहे हैं बहुत जल्दी है। आपके परिवर्तनों के बाद सिस्टम कुंजीपटल को समायोजित करने के लिए सब कुछ रिलेआउट करेगा और आपके परिवर्तनों का कोई प्रभाव नहीं पड़ेगा।

इसके अलावा, मैं आपको ऑटोलायआउट पर स्विच करने और फ्रेम के बारे में भूलने की सलाह देता हूं।

+0

आपका समाधान वह करता है जो आप कहते हैं, लेकिन मैं नहीं चाहता कि मेरी एनीमेशन * के बाद * कीबोर्ड समाप्त हो गया हो; मुझे समझ में नहीं आता कि मैं जिस व्यवहार को देखता हूं उसे "कीबोर्ड को समायोजित करने के लिए रिलेआउट" के रूप में वर्णित किया जा सकता है; और मुझे समझ में नहीं आया कि क्यों मेरा कोड आईओएस 7 में काम करता था लेकिन आईओएस 8 में नहीं। – Pitarou

0

कीबोर्ड के फ्रेम देने के लिए UIKeyboardWillShowNotification userInfo का उपयोग करने का प्रयास करें। फिर उस पर आधारित ऑनस्क्रीन तत्वों को ले जाएं।

+0

यही वह है जो मैं सब कुछ कर रहा हूं, और यह आईओएस 7 में बहुत अच्छा काम करता है।लेकिन आईओएस 8 में यह उसी तरह से व्यवहार करता है जैसा कि मैंने ऊपर दिया है (बहुत आसान) उदाहरण कोड: फ्रेम * विपरीत * दिशा में जिस तरह से मैं इसे बताता हूं, उससे कूदता है, और फिर अपनी मूल स्थिति पर वापस स्लाइड करता है। – Pitarou

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