2012-12-14 14 views
7

मुझे transitionWithView और animateWithDuration के साथ समस्याएं हैं। मेरे animateWithDuration ब्लॉक में से एक संक्रमण नहीं होता है, यह अचानक परिवर्तन होता है, और transitionWithView अस्थायी रूप से उपयोगकर्ता इंटरैक्शन को अक्षम नहीं करता है। मैंने दस्तावेज़ों की जांच की है और मेरा मानना ​​है कि मैं सब ठीक से कर रहा हूं, लेकिन जाहिर है कि कुछ गलत है। कोड के दो ब्लॉक यहां दिए गए हैं:संक्रमण के साथ समस्याएंविथव्यू और एनिमेटेड

यह मेरे मुख्य दृश्य नियंत्रक ViewController में है जिसमें तीन कंटेनर दृश्य/बाल दृश्य नियंत्रक हैं। यह ब्लॉक कंटेनर दृश्यों में से एक को स्थानांतरित करता है, लेकिन संक्रमण होने पर ViewController में उपयोगकर्ता को अन्य इंटरैक्शन से अवरुद्ध नहीं करता है।

[UIView transitionWithView:self.view duration:0.5 options:UIViewAnimationOptionCurveEaseOut animations:^ { 
     CGRect frame = _containerView.frame; 
     frame.origin.y = self.view.frame.size.height - _containerView.frame.size.height; 
     _containerView.frame = frame; 
}completion:^(BOOL finished) { 
    // do something 
}]; 

यह मेरा कंटेनर दृश्य नियंत्रकों में से एक में है। एनीमेशन का कोई प्रभाव नहीं पड़ता है क्योंकि productTitleLabel और productDescriptionTextView के पाठ अचानक बदलते हैं जैसे एनीमेशन ब्लॉक मौजूद नहीं है।

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{  
    [self.viewController toggleFlavoredOliveOilsTableView]; 

    if (indexPath.row > 0) { 
     NSDictionary *selectedCellDict = [[_flavoredOliveOilsDict objectForKey:@"Unflavored Olive Oils"] objectAtIndex:indexPath.row - 1]; 

     [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^ { 
      self.viewController.productTitleLabel.text = [_flavoredOliveOilsTableView cellForRowAtIndexPath:indexPath].textLabel.text; 
      self.viewController.productDescriptionTextView.text = [selectedCellDict objectForKey:@"Description"]; 
     }completion:nil]; 

     if (indexPath.row == 1) { 
      [self.viewController setProductDescriptionTextViewFrameForInformationTab]; 
     } 
     else { 
      [self.viewController setProductDescriptionTextViewFrameForNonInformationTab]; 

      //self.viewController.productImageView.image = [UIImage imageNamed:[selectedCellDict objectForKey:@"Image"]]; 
     } 
    } 
} 

मुझे लगता है कि समस्याएं कुछ हद तक संबंधित हैं क्योंकि मेरी अधिकांश एनीमेशन और संक्रमण ब्लॉक पूरी तरह से काम नहीं करते हैं। किसी भी मदद के लिए धन्यवाद।

संपादित

मेरा लक्ष्य क्या है एक कंटेनर दृश्य घूम रहा है ViewController में और एक लेबल, पाठ देखने के लिए, और छवि को देखने के पाठ और छवि गुण सेट करने के लिए कोशिश कर रहा हूँ; जिनमें से सभी मुख्य दृश्य में हैं। इन गुणों का विवरण बाल दृश्य नियंत्रक के माध्यम से भेजा जाता है। transitionWithViewtoggleFlavoredOiveOilsTableView नामक विधि में है जिसे didSelectRowAtIndexPath में कहा जाता है। मुझे लगता है कि समस्या यह है कि मैं एक ही समय में दो अलग-अलग एनीमेशन/संक्रमण ब्लॉक को कॉल करने की कोशिश कर रहा हूं।

उत्तर

13

यदि आप एनीमेशन से गुजरने वाले किसी अन्य दृश्य के सबव्यू पर एक एनीमेशन किया जाता है तो आप एक दूसरे के साथ हस्तक्षेप करते हुए दो एनिमेशन के इस व्यवहार का अनुभव कर सकते हैं। इस प्रकार, यदि आप transitionWithView:self.view (यानी मुख्य दृश्य पर) करते हैं जैसे आपके कोड स्निपेट से पता चलता है, तो आपको समस्याएं हो सकती हैं। यदि आप अलग-अलग सबव्यूज़ पर दो एनिमेशन निष्पादित करते हैं, तो समस्या दूर हो सकती है। नीचे मेरी मूल जवाब में, मैं:

  • एक subview दो UILabel नियंत्रण है पर transitionWithView प्रदर्शन करना;

  • मुख्य दृश्य के एक सबव्यू के भीतर मेरे व्यू कंट्रोलर की रोकथाम बच्चे के विचार रखो, और फिर transitionFromViewController उस सबव्यू में बाध्य है।

जब मैं दो एनिमेटेड हिस्सों को अलग-अलग सबव्यूव्स पर डालता हूं, तो एनिमेशन घटना के बिना एक साथ हो सकता है।


आप दो पाठ लेबल की सामग्री को बदलने चेतन करना चाहते हैं, तो आप कर सकते हैं:

[UIView transitionWithView:self.viewController.textLabelsContainerView 
        duration:0.5 
        options:UIViewAnimationOptionTransitionCrossDissolve 
       animations:^{ 
        self.viewController.productTitleLabel.text = [_flavoredOliveOilsTableView cellForRowAtIndexPath:indexPath].textLabel.text; 
        self.viewController.productDescriptionTextView.text = [selectedCellDict objectForKey:@"Description"]; 
       } 
       completion:nil]; 

आम तौर पर मैं animateWithDuration का उपयोग करते हैं, लेकिन पाठ विशेषता एक animatable संपत्ति नहीं है, इसलिए यही कारण है कि मैं transitionWithView का उपयोग करता हूं, यह सुनिश्चित कर रहा हूं कि मेरे पास उन टेक्स्ट फ़ील्ड के लिए एक कंटेनर है। लेकिन मैंने animateWithDuration का उपयोग करके अन्य नियंत्रणों को एनिमेट करने का प्रयास किया है, साथ ही बाल नियंत्रकों के परिवर्तन को एनिमेट करते हुए, और यह ठीक काम करता है।

बच्चे दृश्य नियंत्रकों को संक्रमण के लिए, मैं कंटेनर बाल नियंत्रक के विचारों के स्वैपिंग को एनिमेट करने के लिए transitionFromViewController का उपयोग करता हूं (यह Managing Child View Controllers in a Custom Container विधियों के परिवार का हिस्सा है)। उस प्रक्रिया को सुविधाजनक बनाने के लिए, मैंने अपने मुख्य दृश्य नियंत्रक के दृश्य पर एक कंटेनर दृश्य रखा है, और उस कंटेनर के सबव्यूव के रूप में बाल नियंत्रक के विचार जोड़ें। इस तरह, जब मैं बच्चे के संक्रमण को एनिमेट करता हूं, तो एनिमेशन उस कंटेनर व्यू पर अच्छी तरह से बाध्य होते हैं। ,

- (void)addFirstChild 
{ 
    UIViewController *child = [self.storyboard instantiateViewControllerWithIdentifier:@"Stooge"]; 
    [self addChildViewController:child]; 

    child.view.frame = self.bottomContainerView.bounds; 
    [self.bottomContainerView addSubview:child.view]; 

    [child didMoveToParentViewController:self]; 
} 

- (void)changedChild 
{ 
    UIViewController *oldController = [self.childViewControllers lastObject]; 
    UIViewController *newController; 

    if (self.segmentedControl.selectedSegmentIndex == 0) 
     newController = [self.storyboard instantiateViewControllerWithIdentifier:@"Stooge"]; 
    else 
     newController = [self.storyboard instantiateViewControllerWithIdentifier:@"Marx"]; 

    [oldController willMoveToParentViewController:nil]; 
    [self addChildViewController:newController]; 

    // start off screen below 

    CGRect startFrame = self.bottomContainerView.bounds; 
    startFrame.origin.y += startFrame.size.height; 

    // end up where it's supposed to be, right in the container 

    newController.view.frame = startFrame; 

    [self transitionFromViewController:oldController 
         toViewController:newController 
           duration:0.5 
           options:0 
          animations:^{ 
           newController.view.frame = self.bottomContainerView.bounds; 
          } 
          completion:^(BOOL finished) { 
           [oldController removeFromParentViewController]; 
           [newController didMoveToParentViewController:self]; 
          }]; 

} 

निष्कर्ष मैं:

तो, यहाँ कुछ नमूना मैं एक खंडित बटन का उपयोग कर दो बच्चे दृश्य नियंत्रकों के बीच संक्रमण के लिए उपयोग अपने कंटेनर दृश्य के लिए एक दृश्य नियंत्रक जोड़ने के लिए कोड, और फिर कोड है दोनों कंटेनर बाल नियंत्रकों और अभिभावक नियंत्रक में फ़ील्ड एनिमेट करने में कोई समस्या नहीं है। शायद मैं उस समस्या को समझ नहीं रहा हूं जिसका आप वर्णन कर रहे हैं। या हो सकता है कि हम एनिमेटिंग में अंतर के बारे में कुछ सूक्ष्म हो। यदि आप चाहते हैं, तो मैंने गिटूब पर this above code डाल दिया है यदि आप एक नज़र रखना चाहते हैं।

+0

यदि आप एक ही समय में दोनों लेबल एनिमेट करना चाहते हैं, तो दो लेबल अपने लेबल कंटेनर व्यू पर रखें और फिर इसे 'संक्रमण WithView' के पहले पैरामीटर के रूप में उपयोग करें। – Rob

+0

मेरे पास उनमें से एक आंशिक रूप से सही तरीके से काम कर रहा है। क्या 'एनिमेट विथ अवधि' और 'UIViewAnimationOptionTransitions' को गठबंधन करना या 'संक्रमण WithView' और' UIViewAnimationOptions' (गैर-संक्रमण) को गठबंधन करना संभव नहीं है? ऐसा लगता है जब मेरे पास ये है कि वे काम नहीं करते हैं, लेकिन अगर मैं 'संक्रमण WithView' के साथ संक्रमण विकल्पों का उपयोग करता हूं तो यह काम करता है, और इसी तरह एनिमेशन के साथ। मैंने दस्तावेज़ पढ़े हैं और ऐसा लगता है कि उन सभी को एक साथ जोड़ना संभव है लेकिन यह मेरे लिए काम नहीं करता है। –

+0

कृपया संशोधित प्रश्न देखें। धन्यवाद –

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