2012-02-03 26 views
10

Tôi có một scrollView với phân trang được kích hoạt và một số N của các trang, được UIViews như subviews của scrollView.Làm cách nào để tôi có thể lồng ghép Hoạt ảnh lõi cho các Lớp khác nhau?

Tôi đang cố gắng để làm như sau:

cuộn tài khoản để số trang n. Tại thời điểm đó, 7 CALayers trước đó đã được thêm vào số trang (nghĩa là, để trang [[scrollView subviews] objectAtIndex: n-1] .layer subLayers]) phai dần, cái khác.

Nhưng tôi không thể tìm ra cách làm cho các CALayers mờ dần.Trong thời gian này, tôi đã thử 3 phương pháp sau đây từ phương thức ủy nhiệm của bộ điều khiển của tôi: (giả sử tôi có một mảng cho các lớp và độ mờ của chúng) được đặt thành 0 khi tạo)

- (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]; 
    } 
} 

Nhưng dường như không hoạt động. Khi người dùng cuộn đến đúng trang, tất cả các lớp sẽ hiển thị cùng một lúc, mà không bị mờ dần và chắc chắn không theo thứ tự tuần tự.

Bất kỳ ý tưởng nào?

Trả lời

18

Trên thực tế, hóa ra chính là nhận được thời gian hiện tại trong điều khoản của một hệ quy chiếu và thêm bất kỳ thời gian bù đắp cho rằng thời điểm hiện tại. Điều này cũng hoạt động cho các hoạt ảnh không được nhóm.

Ví dụ, một cái gì đó dọc theo dòng của mã này sẽ gây ra n lớp (giả định phải được lưu trữ trong một số mảng) để tuần tự phai trong một sau khi khác, mỗi chụp 0,8 giây .:

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]; 

Trong trường hợp trên, khung tham chiếu chỉ đơn giản là thời gian hiện tại khi các cuộc gọi diễn ra.

5

Thuộc tính beginTime của CAAnimation chỉ có vẻ hoạt động nếu CAAnimation là một phần của CAAnimationGroup. Tôi nghĩ bạn cũng sẽ cần đặt thuộc tính duration của số CAAnimationGroup đủ lớn để kéo dài cho đến khi hoạt ảnh cuối cùng hoàn thành.

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

0

Trong Swift 3 (lớp là một mảng của CALayer hoặc CAShapeLayer)

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 
} 

Và trong trường hợp bạn đang tự hỏi điều gì ovalPathSmall và ovalPathLarge là:

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) 
Các vấn đề liên quan