2015-05-02 51 views
0

我需要幫助進行圓形過渡。iOS:使用animateTransition方法時無法更改持續時間

我翻遍了你的article,並嘗試將swift更改爲object-c項目。

當我使用動畫控制器時,發生問題。

在使用我的MaterialCircleAnimator.m:

#import "MaterialCircleAnimator.h" 
#import "ViewController.h" 
#import "ViewController2.h" 

@implementation MaterialCircleAnimator 


- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext{ 
    return 2.5; 
} 


- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext{ 
    self.transitionContext = transitionContext; 
    UIView* containerView = [transitionContext containerView]; 
    ViewController *fromViewController = (ViewController *) [transitionContext viewControllerForKey:(UITransitionContextFromViewControllerKey)]; 
    UIViewController *toViewController = (UIViewController *)[transitionContext viewControllerForKey:(UITransitionContextToViewControllerKey)]; 
    UIButton* button = fromViewController.button; 

    [containerView addSubview:toViewController.view]; 

    UIBezierPath* circleMaskPathInitial = [UIBezierPath bezierPathWithOvalInRect: 
             button.frame]; 
    CGPoint extremePoint = CGPointMake([button center].x, [button center].y - CGRectGetHeight(toViewController.view.bounds)); 
    CGFloat radius = sqrt(extremePoint.x * extremePoint.x) + (extremePoint.y * extremePoint.y); 
    UIBezierPath* circleMaskPathFinal = [UIBezierPath bezierPathWithOvalInRect: 
    CGRectInset(button.frame, -radius, -radius)]; 
    CAShapeLayer* maskLayer = [CAShapeLayer new]; 
    maskLayer.path = circleMaskPathFinal.CGPath; 
    toViewController.view.layer.mask = maskLayer; 

    CABasicAnimation* maskLayerAnimation = [CABasicAnimation animationWithKeyPath:@"path"]; 
    maskLayerAnimation.fromValue = (__bridge id)(circleMaskPathInitial.CGPath); 
    maskLayerAnimation.toValue = (__bridge id)([circleMaskPathFinal CGPath]); 
    maskLayerAnimation.duration = [self transitionDuration: transitionContext]; 
    maskLayerAnimation.delegate = self; 

    [maskLayer addAnimation:maskLayerAnimation forKey:@"path"]; 

} 

-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{ 
    [self.transitionContext completeTransition:![self.transitionContext transitionWasCancelled]]; 
    [self.transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey].view.layer.mask = nil; 
} 

@end 

而且MaterialCircleAnimator.h:

#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 

@interface MaterialCircleAnimator : NSObject <UIViewControllerAnimatedTransitioning> 

@property (nonatomic, weak) IBOutlet id<UIViewControllerContextTransitioning> transitionContext; 

@end 

我發現我的代碼不能改變動畫的持續時間。

無論NSTimeInterval如何更改,圓形動畫將持續默認0.3秒。

+0

這就是指的項目,我下載 http://cdn1.raywenderlich.com/wp-content/uploads/2014/12/CircleTransitionFinalUpdated.zip 而我的項目在Github上: https://github.com/ TindleWei/MaterialCircleAnimation – AdamWei

回答

0

您在計算半徑時做了小錯誤。

您的代碼:

CGFloat radius = sqrt(extremePoint.x * extremePoint.x) + (extremePoint.y * extremePoint.y); 

更換新代碼:

CGFloat radius = sqrt((extremePoint.x * extremePoint.x) + (extremePoint.y * extremePoint.y)); 

其實你沒有保持架拍X和Y對象的平方所以會有半徑計算錯誤後。

根據公式,我們需要做X和Y座標的平方後做平方根。

希望這會幫助你。

+0

非常感謝。問題修復了。這是我迅速轉換爲object-c的愚蠢錯誤。 – AdamWei

+0

歡迎傢伙... –

相關問題