2012-02-03 7 views
10

मेरे पास पेजिंग सक्षम के साथ एक स्क्रॉल व्यू है और पेजों की एक संख्या एन है, जो स्क्रू व्यू के सबव्यूव के रूप में UIViews हैं।मैं अलग-अलग परतों के लिए एक दूसरे के बाद कोर एनिमेशन कैसे श्रृंखला कर सकता हूं?

उपयोगकर्ता को पेज संख्या n स्क्रॉल:

मैं निम्न कार्य करने की कोशिश कर रहा हूँ। उस बिंदु पर, 7 कैलियर जिन्हें पहले पृष्ठ संख्या एन (यानी पृष्ठ [[scrollView सबव्यूज] ऑब्जेक्टएट इंडेक्स: एन -1] .layer subLayers] में जोड़ा गया था, एक दूसरे के बाद एक में फीका।

लेकिन मैं यह नहीं समझ सकता कि कैलियर को अनुक्रमिक रूप से कैसे बनाया जाए। अब तक, मैंने अपने नियंत्रक के प्रतिनिधि विधि से निम्नलिखित 3 दृष्टिकोणों का प्रयास किया है: (मान लें कि मेरे पास परतों के लिए एक सरणी है और उनकी अस्पष्टता सृजन पर 0 पर सेट किया गया था)

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
{ 
    int pageNumber = floor(self.scrollView.contentOffset.x/self.scrollView.frame.size.width); 
    if(pageNumber == (n-1)) 
    { 
    int timeOffset = 0; 

    [CATransaction begin]; 
    for(CALayer *layer in layerArray) 
    { 
     CABasicAnimation *a = [CABasicAnimation animationWithKeyPath:@"opacity"]; 
     a.duration = 6; 
     a.beginTime = timeOffset++; 
     a.fromValue = [NSNumber numberWithFloat:0.]; 
     a.toValue = [NSNumber numberWithFloat:1.]; 

     [layer addAnimation:a forKey:nil]; 
    } 
    [CATransaction commit]; 
    } 
} 

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
{ 
    int pageNumber = floor(self.scrollView.contentOffset.x/self.scrollView.frame.size.width); 
    if(pageNumber == (n-1)) 
    { 
    int timeOffset = 0; 

    [CATransaction begin]; 
    for(CALayer *layer in layerArray) 
    { 
     CABasicAnimation *a = [CABasicAnimation animation]; 
     a.duration = 6; 
     a.beginTime = timeOffset++; 
     [layer addAnimation:a forKey:@"opacity"]; 
     [layer setOpacity:1]; 
    } 
    [CATransaction commit]; 
    } 
} 


- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
{ 
    int pageNumber = floor(self.scrollView.contentOffset.x/self.scrollView.frame.size.width); 
    if(pageNumber == (n-1)) 
    { 
    int timeOffset = 0; 


    for(CALayer *layer in layerArray) 
    { 
     [CATransaction begin]; 
     CABasicAnimation *a = [CABasicAnimation animation]; 
     a.duration = 6; 
     a.beginTime = timeOffset++; 
     [layer addAnimation:a forKey:@"opacity"]; 
     [layer setOpacity:1]; 
    } 

    for(CALayer *layer in layerArray) 
     [CATransaction commit]; 
    } 
} 

लेकिन न तो काम करता है। जब उपयोगकर्ता सही पृष्ठ पर स्क्रॉल करता है, तो सभी परतें एक बार में दिखाई देती हैं, बिना किसी फीका के और निश्चित रूप से किसी अनुक्रमिक क्रम में नहीं।

कोई विचार?

उत्तर

18

वास्तव में, पता चला है कुंजी संदर्भ का एक फ्रेम के संदर्भ में वर्तमान समय हो रही है और किसी भी समय है कि वर्तमान समय में ऑफसेट जोड़ रहा है। यह गैर-समूहित एनिमेशन के लिए भी काम करता है।

उदाहरण के लिए, इस कोड की तर्ज पर कुछ कारण n परतों, (कुछ सरणी में संग्रहीत मान लिया) एक के बाद एक में फीका क्रमानुसार करने के लिए प्रत्येक लेने .8 सेकेंड .:

CGFloat timeOffset = 0; 
    [CATransaction begin]; 
    for(CALayer *layer in layers) 
    { 
    CABasicAnimation *a = [CABasicAnimation animationWithKeyPath:@"opacity"]; 
    a.fromValue = [NSNumber numberWithFloat:0.]; 
    a.toValue = [NSNumber numberWithFloat:1.]; 
    a.fillMode = kCAFillModeForwards; 
    a.beginTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil] + timeOffset; 
    a.duration = .8; 
    a.removedOnCompletion = NO; 
    [layer addAnimation:a forKey:nil]; 

    timeOffset += .8; 
    } 
    [CATransaction commit]; 

हैं उपर्युक्त मामले में, संदर्भ का फ्रेम केवल वर्तमान समय है जब आमंत्रण होता है।

5

beginTimeCAAnimation की संपत्ति केवल CAAnimationCAAnimationGroup का हिस्सा होने पर काम करती है। मुझे लगता है कि आपको durationCAAnimationGroup की संपत्ति को सेट करने की आवश्यकता होगी, जब तक कि इसकी अंतिम एनीमेशन पूर्ण न हो जाए।

https://stackoverflow.com/a/563486/77567

0

स्विफ्ट में 3

var timeOffset:Double = 0 
for layer in layers { 
    let a = CABasicAnimation(keyPath: "path" 
    a.fromValue = layer.ovalPathSmall.cgPath 
    a.toValue = layer.ovalPathLarge.cgPath 
    a.fillMode = kCAFillModeForwards 
    a.beginTime = CACurrentMediaTime() + timeOffset 
    a.duration = 0.3 
    a.isRemovedOnCompletion = false 
    layer.add(a, forKey: nil) 

    timeOffset += 0.3 
} 

और मामले में आप सोच रहे हैं (परतों CALayer या CAShapeLayer की एक सरणी है) क्या ovalPathSmall और ovalPathLarge हैं:

ovalPathSmall = UIBezierPath(arcCenter: position, radius: smallRadius, startAngle: 0, endAngle: 2 * .pi, clockwise: true) 
ovalPathLarge = UIBezierPath(arcCenter: position, radius: largeRadius, startAngle: 0, endAngle: 2 * .pi, clockwise: true) 
संबंधित मुद्दे

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