2012-03-02 8 views
13

मैंने परत के transform.rotation और transform.translation.x गुणों को एनिमेट करने के लिए CAKeyframeAnimations का उपयोग किया है, लेकिन मुझे transform संपत्ति को पूर्ण रूप से एनिमेट करने में समस्या हो रही है। मेरे पास एक परत है जो दो राज्यों और सीएबीएसिक एनीमेशन के डिफ़ॉल्ट इंटरपोलेशन के बीच एनिमेट होना चाहिए और पूरी तरह गलत है और जिस मार्ग को मैं चाहता हूं उसका पालन नहीं करता है। बचाव के लिए CAKeyframe एनीमेशन, या तो मैंने सोचा। CAKeyframeAnimation का उपयोग करके transform को एनिमेट करने के किसी भी प्रयास को अन्य एनिमेशन चलाने के दौरान तत्काल अंतिम रूप में स्नैप करने के दृश्य में परिणाम दिखाई देते हैं। यदि मैं निम्नलिखित फ़ंक्शन के पहले भाग को हटा देता हूं और मेरे "ट्रांसफॉर्म" ईवेंट को नीचे CAAasicAnimation का उपयोग करने देता है, तो यह ठीक से एनिमेट करता है - यद्यपि गलत तरीके से इंटरपोलेटेड ट्रांसफ़ॉर्म के साथ-साथ।मैं CAKrfrformAnimation के साथ CATransform3Ds को कैसे एनिमेट कर सकता हूं?

मेरे परत प्रतिनिधि लागू किया गया है निम्नलिखित:

- (id <CAAction>) actionForLayer:(CALayer *)layer forKey:(NSString *)event 
{  
    if ([event isEqualToString:@"transform"]) 
    { 
     CGSize startSize = ((CALayer *)self.layer.presentationLayer).bounds.size; 
     CGSize endSize = self.layer.bounds.size; 

     CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:event]; 
     animation.duration = 0.25; 

     NSMutableArray *values = [NSMutableArray array]; 

     int stepCount = 10; 
     for (int i = 0; i < stepCount; i++) 
     { 
      CGFloat p = i/(float)(stepCount - 1); 
      CGSize size = [self interpolateBetweenSize:startSize andSize:endSize percentage:p]; 
      CATransform3D transform = [self transformForSize:size]; 
      [values addObject:[NSValue valueWithCATransform3D:transform]]; 
     } 

     animation.values = values; 
     return animation; 
    } 

    // All other animations use this basic animation 
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:event]; 
    animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
    animation.removedOnCompletion = YES; 
    animation.fillMode = kCAFillModeForwards; 
    animation.duration = 0.25; 
    return animation; 
} 

बदलना मेरा एक अनुवाद एक घुमाने के बाद है, लेकिन मुझे लगता है कि अलग-फ़्रेम एनिमेशन एक अनुवाद के माध्यम से एनिमेट और एक घुमाएं पागल में परिणाम होगा के साथ एक समूह एनीमेशन नगर। मैंने पुष्टि की है कि आकार & ट्रांसफॉर्म पी के सभी मानों के लिए सही है, और पी सख्ती से 0 से 1.

मैंने एक गैर-डिफ़ॉल्ट समय फ़ंक्शन सेट करने का प्रयास किया है, मैंने सेटिंग करने का प्रयास किया है टाइम फ़ंक्शंस की एक सरणी, मैंने कीटाइम्स को छोड़ दिया है, मैंने दोहराया है, 0 का नंबर, हटाया गया अपूर्ण = हाँ, और आगे का एक भरने वाला मोड और इसका कोई प्रभाव नहीं पड़ा। क्या मैं ट्रांसफॉर्म कीफ्रेम एनीमेशन सही ढंग से नहीं बना रहा हूं?

+1

क्या आप शायद सटीक प्रभाव को स्पष्ट कर सकते हैं जिसे आप प्राप्त करने का प्रयास कर रहे हैं? आप इसे एक रोटेशन के बाद अनुवाद के रूप में वर्णित करते हैं, लेकिन आपके कोड से ऐसा लगता है कि सीमाएं भी एनिमेटिंग कर रही हैं - क्या यह सही है?आप परत को स्थानांतरित करना चाहते हैं, फिर घुमाएं, चाल या घुमावदार एनीमेशन के दोनों चरणों में निरंतर बढ़ते या घटते हुए सीमाएं घुमाएं? – GSnyder

+0

इसे निहित होने की आवश्यकता क्यों है? यह कोड हैकी दिखता है। यदि आप ठीक दाग नियंत्रण चाहते हैं तो क्यों न केवल एनीमेशन बनाएं और इसे सीधे परत पर जोड़ें, जो आप कहते हैं कि आप पहले से ही काम कर रहे हैं? अगर आप चीजें अपनी डिफ़ॉल्ट एनीमेशन का उपयोग करना चाहते हैं तो बस उस प्रतिनिधि विधि से 'शून्य' वापस करें। –

उत्तर

0

यह तकनीक आईओएस 3 में वापस काम करती है लेकिन आईओएस 5.0 में टूटा हुआ लग रहा था।

5.1 'जादुई रूप से' इसे ठीक किया गया, यह आईओएस 5.0 में एक बग प्रतीत होता था। मैं एक रडार फाइल करूंगा, लेकिन अब यह 5.1 में काम कर रहा है।

@Gsnyder: कुछ पृष्ठभूमि: मैं साफ़-जैसी यूआई (कुछ साफ़ करने के लिए पूरी तरह से असंबंधित) के साथ प्रयोग कर रहा हूं और इसके साथ आया: http://blog.massivehealth.com/post/18563684407/clear। इसे & अनुवाद के घूर्णन की आवश्यकता को समझा जाना चाहिए।

मैंने तब से एक शटर संक्रमण बनाया है जो एन परतों (केवल 2 की बजाय) में दृश्य को उप-विभाजित करता है जो इस तरफ से देखे जाने पर दिखता है: /////।

मेरा कोड सीमाओं को एनिमेट नहीं कर रहा है, यह आवश्यक परिवर्तन को निर्धारित करने के लिए प्रत्येक चरण में आकार का उपयोग कर रहा है।

@ पॉल.s: इम्प्लीट मुझे परत नियंत्रक को प्रदूषित किए बिना परत वर्ग के भीतर ही इस अमूर्तता को रखने की अनुमति देता है। व्यू कंट्रोलर को बस सीमाओं को बदलना चाहिए और परत को उचित रूप से स्थानांतरित करना चाहिए। मैं दृश्य नियंत्रकों के प्रशंसक नहीं हूं, जिनमें दर्जनों कस्टम एनिमेशन होते हैं जब विचार स्वयं इसे संभाल सकते हैं।

मुझे एक कीफ्रेम एनीमेशन का उपयोग करने की आवश्यकता है क्योंकि परत के बीच डिफ़ॉल्ट एनीमेशन गलत कोणों के माध्यम से बदलता है और _ एनिमेट करता है ताकि /// \ परतें पूरे ट्रांसफॉर्म में लाइन न हों। कीफ्रेम एनीमेशन सभी किनारों को किनारों पर सही ढंग से किनारों को सुनिश्चित करते हैं।

मैं इस बंद पर विचार कर रहा हूं, यह आईओएस 5.0 में एक बग प्रतीत होता है और तब से तय किया गया है। सबको धन्यवाद।

0
(void)animateViewWith3DCurrentView:(UIView *)currentView withPoing:(CGPoint)movePoint 
{ 
    //flip the view by 180 degrees in its place first. 
    currentView.layer.transform =   CATransform3DRotate(currentView.layer.transform,myRotationAngle(180), 0, 1, 0); 

    //set the anchor point so that the view rotates on one of its sides. 
    currentView.layer.anchorPoint = CGPointMake(0.5, 0.5); 

    //Set up scaling 

    CABasicAnimation *resizeAnimation = [CABasicAnimation animationWithKeyPath:kResizeKey]; 

    //we are going to fill the screen here. So 423,337 
    [resizeAnimation setToValue:[NSValue valueWithCGSize:CGSizeMake(423, 337)]]; 
    resizeAnimation.fillMode   = kCAFillModeForwards; 
    resizeAnimation.removedOnCompletion = NO; 

    // Set up path movement 

    UIBezierPath *movePath = [UIBezierPath bezierPath]; 

    //the control point is now set to centre of the filled screen. Change this to make the path different. 
    // CGPoint ctlPoint  = CGPointMake(0.0, 0.5); 
    CGPoint ctlPoint  = CGPointMake(1024/2, 768/2); 

    //This is the starting point of the animation. This should ideally be a function of the frame of the view to be animated. Hardcoded here. 

    // Set here to get the accurate point.. 
    [movePath moveToPoint:movePoint]; 

    //The anchor point is going to end up here at the end of the animation. 
    [movePath addQuadCurveToPoint:CGPointMake(1024/2, 768/2) controlPoint:ctlPoint]; 

    CAKeyframeAnimation *moveAnim = [CAKeyframeAnimation animationWithKeyPath:kPathMovement]; 

    moveAnim.path    = movePath.CGPath; 
    moveAnim.removedOnCompletion = YES; 

    // Setup rotation animation 

    CABasicAnimation* rotateAnimation = [CABasicAnimation animationWithKeyPath:kRotation]; 
    //start from 180 degrees (done in 1st line) 
    CATransform3D fromTransform  = CATransform3DMakeRotation(myRotationAngle(180), 0, 1, 0); 
    //come back to 0 degrees 
    CATransform3D toTransform   = CATransform3DMakeRotation(myRotationAngle(0), 0, 1, 0); 

    //This is done to get some perspective. 
    CATransform3D persp1 = CATransform3DIdentity; 
    persp1.m34 = 1.0/-3000; 

    fromTransform = CATransform3DConcat(fromTransform, persp1); 
    toTransform = CATransform3DConcat(toTransform,persp1); 

    rotateAnimation.toValue    = [NSValue valueWithCATransform3D:toTransform]; 
    rotateAnimation.fromValue   = [NSValue valueWithCATransform3D:fromTransform]; 
    //rotateAnimation.duration   = 2; 
    rotateAnimation.fillMode   = kCAFillModeForwards; 
    rotateAnimation.removedOnCompletion = NO; 


    // Setup and add all animations to the group 

    CAAnimationGroup *group = [CAAnimationGroup animation]; 

    [group setAnimations:[NSArray arrayWithObjects:moveAnim,rotateAnimation, resizeAnimation, nil]]; 

    group.fillMode   = kCAFillModeForwards; 
    group.removedOnCompletion = NO; 
    group.duration   = 0.7f; 
    group.delegate   = self; 

    [group setValue:currentView forKey:kGroupAnimation]; 

    [currentView.layer addAnimation:group forKey:kLayerAnimation]; 
} 
संबंधित मुद्दे

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