2014-11-03 101 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

相关问题