2011-11-10 14 views
5

एनिमेट करते समय अजीब व्यवहार मैं UITextField को एनिमेट करने की कोशिश कर रहा हूं लेकिन मुझे एक परेशान और अजीब समस्या से पकड़ा गया है।UITextField

first state

पहले राज्य में आवेदन UITextField है, कैमरा UIButton और कैमरा बटन है कि क्योंकि यह सीमा से बाहर तैनात किया गया है पता चला नहीं किया गया के बाद रद्द UIButton: मेरी एनीमेशन निम्न क्रम है आवेदन के असल में अपने आवेदन की चौड़ाई 320 है और रद्द बटन मूल (350,7)

second state

दूसरे राज्य में, जब UITextField पर उपयोगकर्ता छूता है, कैमरा बटन अल्फ़ा चैनल 0 पर सेट है और का मूल है रद्द करें बटन (247,7) पर सेट है।

final state

अंतिम अवस्था पहला राज्य उपयोगकर्ता के बाद कीबोर्ड की वापसी बटन पर या में छुआ बटन को रद्द के समान है।

प्रक्रिया के दौरान यूआईटीक्स्टफिल्ड चौड़ाई और एक्स अक्ष में रद्द बटन मूल एनिमेटेड हैं।

मेरे कोड है:

- (void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
    barcodeSearchButton.userInteractionEnabled = NO; 
    cancelButton.userInteractionEnabled = NO; 

    CGFloat cancelButtonXOffset = CGRectGetMaxX(barcodeSearchButton.frame) - cancelButton.frame.size.width; 
    CGFloat searchFieldWidth = searchField.frame.size.width - cancelButton.frame.size.width + barcodeSearchButton.frame.size.width; 
    [UIView animateWithDuration:0.3 
     animations:^{ 
      searchField.frame = CGRectMake(searchField.frame.origin.x, searchField.frame.origin.y, searchFieldWidth, searchField.frame.size.height); 
      cancelButton.alpha = 1.0;     
      cancelButton.frame = CGRectMake(cancelButtonXOffset, cancelButton.frame.origin.y, cancelButton.frame.size.width,cancelButton.frame.size.height); 

      barcodeSearchButton.alpha = 0.0; 

     } 
     completion:^(BOOL finished) { 
      barcodeSearchButton.userInteractionEnabled = NO; 
      cancelButton.userInteractionEnabled = YES; 
     }];  
} 

- (void)textFieldDidEndEditing:(UITextField *)textField 
{ 
    barcodeSearchButton.userInteractionEnabled = NO; 
    cancelButton.userInteractionEnabled = NO; 

    [UIView animateWithDuration:0.3 
       animations:^{ 
        searchField.frame = CGRectMake(searchField.frame.origin.x, searchField.frame.origin.y, searchFieldStartWidth, searchField.frame.size.height); 
        cancelButton.alpha = 0.0; 
        cancelButton.frame = CGRectMake(cancelButtonStartX, cancelButton.frame.origin.y, cancelButton.frame.size.width,cancelButton.frame.size.height); 
        barcodeSearchButton.alpha = 1.0;     
       } 
       completion:^(BOOL finished) { 
        barcodeSearchButton.userInteractionEnabled = YES; 
        cancelButton.userInteractionEnabled = NO; 
       }];   
} 

जब एनीमेशन केवल पहली बार है, जिसका अर्थ के लिए अंतिम अवस्था तक क्रियान्वित किया जाता है, उपयोगकर्ता UITextField को छुआ, नीचे लिखा (इस भाग महत्वपूर्ण है) मैदान पर कुछ पाठ और उसके बाद उपयोगकर्ता कुंजीपटल रिटर्न बटन पर छू गया समस्या दिखाई देती है। समस्या यह है कि UITextField में टाइप किया गया टेक्स्ट एनिमेटेड होता है जब UITextField की चौड़ाई भी एनिमेटेड होती है।

एनीमेशन bellow तरह बर्ताव करता है: वापस अपने प्रारंभिक मूल्य के लिए

  1. UITextField हिस्सों।
  2. रद्द करें बटन पीठ अपनी प्रारंभिक मूल के
  3. कैमरा बटन 1.0
  4. लिखे गए पाठ UITextField के ऊपरी-बाएं कोने से मक्खियों के लिए निर्धारित है और यह स्थिति के लिए UITextfield में भूमि आईटी चले गए हैं नहीं करना चाहिए।

समस्या यह है कि चरण 4 नहीं होना चाहिए और समस्या यह केवल एक बार होती है। यदि प्रक्रिया फिर से शुरू होती है (uitextfield पर स्पर्श करें, कुछ टेक्स्ट टाइप करें, वापसी कुंजी पर स्पर्श करें) चरण 4 नहीं होता है।

मैं इस समस्या को हल करने के लिए एक दिन लंबा खर्च करता हूं लेकिन मैं असफल रहा।

उत्तर

0

खोज क्षेत्र, _searchField.text = पर कुछ प्लेसहोल्डर पाठ @ "प्लेसहोल्डर"

सेट और यह भी सेट _searchField।clearsOnBeginEditing = हाँ;

या आप कर सकते हैं बस मूल्य बाहर स्पष्ट अगर यह textDidBeginEditing

पर अपने प्लेसहोल्डर पाठ के बराबर है
+0

इसके अलावा, प्लेसहोल्डर पाठ संपत्ति के बजाय पाठ का उपयोग कर अपने रंग के साथ गड़बड़, आपको लगता है कि ठीक करने के लिए ऊपर के साथ-साथ होगा तो हो सकता है। –

0

एक छोटी सी के रूप में मैं इस सटीक एक ही समस्या है, और कुछ अधिक जानकारी के रूप में अच्छी तरह {ठीक सुधार करने के लिए संपादित} हैक वास्तव में मेरे लिए इसे ठीक कर रहा है।

तो सबसे पहले अधिक जानकारी:

  1. समस्या केवल पहली बार फ्रेम एनिमेशन UITextField फैलता है और वहाँ क्षेत्र में पाठ दर्ज किया गया है होता है। UITextField फिर से संपादित किया जाता है, और एक ही एनिमेशन दोबारा, तो समस्या नहीं होता है।
  2. searchField.clearsOnBeginEditing = YES; समस्या स्पष्ट नहीं है।
  3. मैं प्लेसहोल्डर पाठ का उपयोग कर रहा हूं जब समस्या देखी गई है। इसका परिणाम पर कोई प्रभाव नहीं पड़ता है।
  4. 1 फ्रेम के लिए पाठ संपत्ति बदलने समस्या समाशोधन का असर होता है।

    मेरी viewDidLoad मैं एक ही स्थान के लिए पाठ संपत्ति की स्थापना कर रहा हूँ में, तो एक बार एक रिक्त स्ट्रिंग पर एक काम भेजने:

यहाँ क्या मैं इसे ठीक करने के लिए कर रहा हूँ है।

-(void)viewDidLoad { 
    searchField.text = @" "; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     searchField.text = @""; 
    }); 
} 
तब मेरे तरीकों कि हटना और UITextField का विस्तार, साथ ही परदे पर एक बटन को रद्द ले जाने में

, मैं अगर यह एक तात्कालिक एनीमेशन है की जाँच करें और 0.0f लिए अवधि निर्धारित।

- (void)showCancelButton { 
    NSTimeInterval duration = 0.3f; 

    [UIView animateWithDuration:duration animations:^{ 
     CGPoint buttonOrigin = cancelButton.frame.origin; 
     CGSize buttonSize = cancelButton.frame.size; 
     CGFloat buttonTravelDist = buttonSize.width + 10.0f; 
     CGPoint onscreenPos = CGPointMake(buttonOrigin.x - buttonTravelDist, buttonOrigin.y); 

     cancelButton.frame = CGRectMake(onscreenPos.x, onscreenPos.y, buttonSize.width, buttonSize.height); 

     CGPoint fieldOrigin = searchField.frame.origin; 
     CGSize fieldSize = searchField.frame.size; 

     searchField.frame = CGRectMake(fieldOrigin.x, fieldOrigin.y, fieldSize.width - buttonTravelDist, fieldSize.height); 
    }]; 
} 

- (void)hideCancelButton { 
    NSTimeInterval duration = 0.3f; 

    [UIView animateWithDuration:duration animations:^{ 
     CGPoint buttonOrigin = cancelButton.frame.origin; 
     CGSize buttonSize = cancelButton.frame.size; 
     CGFloat buttonTravelDist = buttonSize.width + 10.0f; 
     CGPoint onscreenPos = CGPointMake(buttonOrigin.x + buttonTravelDist, buttonOrigin.y); 

     cancelButton.frame = CGRectMake(onscreenPos.x, onscreenPos.y, buttonSize.width, buttonSize.height); 

     CGPoint fieldOrigin = searchField.frame.origin; 
     CGSize fieldSize = searchField.frame.size; 

     searchField.frame = CGRectMake(fieldOrigin.x, fieldOrigin.y, fieldSize.width + buttonTravelDist, fieldSize.height); 
    }]; 
} 

इसने मेरे लिए स्थिति पूरी तरह से तय कर दी है।

6

हर किसी के जवाब के लिए धन्यवाद लेकिन मुझे कुछ समय पहले समाधान मिला है। कीबोर्ड स्थिति के आधार पर UITextField में एनीमेशन शुरू करने का सही तरीका, textFieldShouldBeginEditing और textFieldShouldEndEditing विधियों को ओवरराइड कर रहा है।

मेरी पहली एनिमेशन बनाने का प्रयास मैं textFieldDidBeginEditing और textFieldDidEndEditing अधिभावी किया गया था। मुझे एनीमेशन के कारण textFieldShouldBeginEditing और textFieldShouldEndEditing में काम करने का कारण नहीं पता है, लेकिन textFieldDidBeginEditing और textFieldDidEndEditing में नहीं। लेकिन यह सिर्फ काम करता है।

मेरे संशोधित कोड संस्करण:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { 

    CGFloat cancelButtonXOffset = CGRectGetMaxX(barcodeSearchButton.frame) - cancelButton.frame.size.width; 
    CGFloat searchFieldWidth = searchField.frame.size.width - cancelButton.frame.size.width + barcodeSearchButton.frame.size.width; 
    [UIView animateWithDuration:0.3 
     animations:^{ 
      searchField.frame = CGRectMake(searchField.frame.origin.x, searchField.frame.origin.y, searchFieldWidth, searchField.frame.size.height); 
      cancelButton.alpha = 1.0;     
      cancelButton.frame = CGRectMake(cancelButtonXOffset, cancelButton.frame.origin.y, cancelButton.frame.size.width,cancelButton.frame.size.height); 

      barcodeSearchButton.alpha = 0.0; 

     } completion:^(BOOL finished) { 
      searchField.clearButtonMode = UITextFieldViewModeAlways; 
     }]; 
    return YES; 
} 

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField { 
    [UIView animateWithDuration:0.3 
     animations:^{ 
      searchField.frame = CGRectMake(searchField.frame.origin.x, searchField.frame.origin.y, searchFieldStartWidth, searchField.frame.size.height); 
      cancelButton.alpha = 0.0; 
      cancelButton.frame = CGRectMake(cancelButtonStartX, cancelButton.frame.origin.y, cancelButton.frame.size.width,cancelButton.frame.size.height); 
      barcodeSearchButton.alpha = 1.0;     
     } completion:^(BOOL finished) { 
      searchField.clearButtonMode = UITextFieldViewModeNever; 
     }]; 
    return YES; 
} 
+0

यह अच्छी तरह से काम करता है। UIControlEventEditingDidEnd का उपयोग करते समय एनिमेटिंग UITextFields से संबंधित एक अलग समस्या को हल करता है। इस सेट पर स्विच किया गया और एनिमेशन तय किए गए थे। – jasonjwwilliams

+0

यह अब आईओएस 8.1 (कम से कम) में काम नहीं करता है। –