2014-11-03 35 views
0

我想在iOS中製作自定義展開控制器動畫。如何將CGRect框架值傳遞給自定義過渡動畫控制器

這是一個iPad應用程序,並在主屏幕上有一個大小爲160 * 160的大方形按鈕。我已經將模態連接連接到下一個視圖控制器場景。我試圖實現的是當我點擊UIButton時,目標視圖控制器應該從按鈕擴展,並且動畫完成後將全屏動畫。

我已經子類NSObject和創建ExpandAnimationController,實現了transitionDuration和animateTransition方法。但是我堅持要確定目標視圖控制器視圖的初始框架。

我知道一個按鈕我可以靜態設置框架,但在場景中出現的位置有多個按鈕,並且每個按鈕都必須將模式切換到不同的視圖控制器,而不是如何將按鈕幀傳遞給動畫控制器設置初始視圖框架。

我這樣做只是爲了學習目的後,嘗試raywanderlich的自定義視圖控制器轉換教程。所以現在的問題是將一個框架對象從「源控制器」傳遞給動畫控制器。我已經搜索過,互聯網沒有太多的定製轉換問題。任何幫助將不勝感激。

這裏是我試過,在ExpandAnimationController代碼,

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext { 

    // 1. Fetch all the required objects. 
    UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; 
    UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; 
    UIView *containerView = [transitionContext containerView]; 
    CGRect finalFrame = toVC.view.frame; 

    // 2. Set initial frames. 
    // This is where I am stuck. 
    CGRect initialFrame = CGRectZero; 
    toVC.view.frame = initialFrame; 
    [containerView addSubview:toVC.view]; 

    // 3. Do the animation. 
    NSTimeInterval duration = [self transitionDuration:transitionContext]; 
    [UIView animateWithDuration:duration animations:^{ 
     fromVC.view.alpha = 0.5; 
     toVC.view.alpha = 0.5; 
     toVC.view.frame = finalFrame; 
    } completion:^(BOOL finished) { 
     fromVC.view.alpha = 1.0; 
     toVC.view.alpha = 1.0; 
     toVC.view.frame = finalFrame; 
     [transitionContext completeTransition:YES]; 
    }]; 
} 

在我採用UIViewControllerTransitioningDelegate源控制器,創建了一個ExpandAnimationController實例,並像下面使用,

- (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source { 
    return _expandAnimationController; 
} 

但之後 - prepareForSegue被稱爲我想將發件人按鈕幀傳遞給過渡動畫控制器。

在此先感謝,快樂編碼!

+1

發佈您的代碼獲得伊娃值,所以我們可以看到你做了什麼至今 – Lefteris 2014-11-03 08:27:17

+0

@Lefteris嘿,我已經編輯了帖子,並添加代碼,你詢問,檢查。 – 2014-11-03 08:36:19

回答

3

有你如何能做到這一點,像伊娃您過渡或轉變的委託,你可以通過在按鈕RECT許多方法,但我會建議一個更簡單的方法(儘管有一個警告):

首先通過代碼或在Interface Builder中爲您的UIButton分配一個唯一標記。 在這個例子中,我使用了111標籤:

在你- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext你可以從你的ViewController到按鈕的引用:

CGRect myButtonRect = CGRectZero; 
UIButton *myButton = (UIButton*)[fromVC.view viewWithTag:111]; 
if (myButton) { 
    myButtonRect = myButton.frame; 
    NSLog(@"button Frame:%@",NSStringFromCGRect(myButtonRect)); 
} 

有什麼需要注意的? 如果您正在使用相同的動畫向後轉換,「從」和「到」視圖控制器將會顛倒過來。

此外,如果您在另一個視圖控制器上使用相同的Transition,並且View Controller對另一個對象具有相同的標籤號碼,您將獲得該對象而不是您的Button。

所以,如果你使用這種方法,請務必使用一個全球唯一的電子標籤爲您的整個應用程序,如32565(這裏的隨機數是足夠大,所以你不會再重複使用它)

現在,如果您有多個按鈕,您不能使用上述方法,因此使用伊娃您的自定義轉換:

@interface MyCustomTransition : NSObject <UIViewControllerAnimatedTransitioning> 

@property (nonatomic, assign) CGRect initialFrame; 

@end 

然後在視圖控制器您使用的是自定義的過渡,只是通過在框架:

MyCustomTransition *myTransition = [MyCustomTransition new]; 
myTransition.initialFrame = myButton.frame; 

最後,在你的- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContextself.initialFrame

+0

嘿謝謝。這讓我有點想法如何進一步進行,但實際情況正如我先前所述,即多個按鈕。我有4個按鈕,我正在從所有4個按鈕導航到相同的視圖控制器。我希望viewcontroller的初始框架是點擊發件人按鈕。所以使用標籤變得不方便,但我想到另一種方法來使用全局靜態整數變量在-prepareForSegue方法中設置按鈕發件人的標籤,並使用相同的方法來檢索對象,因此在另一個類中獲取框架。你還有其他更好的方法嗎? – 2014-11-03 09:30:19

+0

看到我的編輯另一種方法 – Lefteris 2014-11-03 09:36:21

+0

嘿謝謝,實際上我已經在動畫控制器中創建了一個框架對象,然後就迷失在我的想法中。大聲笑..感謝您的幫助。 – 2014-11-03 10:06:52

0

您可以將CGRect轉換爲NSValue並將其放入發件人。

// Send it like this 
    [self performSegueWithIdentifier:@"someIdentifier" sender:[NSValue valueWithCGRect:yourFrame]]; 

你也可以找回這樣

// Retrieve it 
    CGRect frame = [sender CGRectValue]; 
+0

我不想在我的目標視圖控制器或prepareForSegue方法中獲取值。我想將它傳遞給一箇中間的AnimationViewcontroller。但是你所暗示的實際上是不同的情況。 – 2014-11-03 09:33:07

相關問題