Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UIView animateWithDuration忽略持续时间_Ios_Objective C_Animation_Uiview - Fatal编程技术网

Ios UIView animateWithDuration忽略持续时间

Ios UIView animateWithDuration忽略持续时间,ios,objective-c,animation,uiview,Ios,Objective C,Animation,Uiview,我的目标很简单,我以前已经做到了这一点,这就是为什么我要在这里问我的问题 我正在尝试设置子视图的动画。很简单。动画结束后,视图将精确地显示在我希望的位置。唯一的问题是: 无论我做什么,动画持续时间都被完全忽略。它立即发生 - (void)callToDismissView:(UIView *)view { [self.view addSubview:view]; [self dismissViewControllerAnimated:NO completion:nil];

我的目标很简单,我以前已经做到了这一点,这就是为什么我要在这里问我的问题

我正在尝试设置子视图的动画。很简单。动画结束后,视图将精确地显示在我希望的位置。唯一的问题是: 无论我做什么,动画持续时间都被完全忽略。它立即发生

- (void)callToDismissView:(UIView *)view {

     [self.view addSubview:view];

     [self dismissViewControllerAnimated:NO completion:nil];

     [UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^(void){

         CGRect frame = self.view.frame;
         frame.origin.x = frame.size.width;
         view.frame = frame;

     } completion:^(BOOL finished){

         [view removeFromSuperview];
     }];
 }
现在,我尝试了不同的帧和持续时间,以查看视图是否设置了动画,并且它总是在我需要的地方结束。只是瞬间

编辑:

上面的代码由视图控制器中的委托调用,如下所示:

- (void)dismissSelf {

    if (self.delegate && [self.delegate respondsToSelector:@selector(callToDismissScan)]) {

        [self.delegate callToDismissScan];
    }
}
该方法本身由通知触发


我必须承认,在两个控制器之间的转换过程中发生了一些我不完全理解的事情。(我非常想了解他们…)

也许你需要这样尝试

- (void)callToDismissView:(UIView *)view {
    [self.view addSubview:view];
    CGRect frame = self.view.frame;
    frame.origin.x = frame.size.width;
    [UIView animateWithDuration:0.3 delay:0.3 
                        options:UIViewAnimationOptionCurveEaseInOut animations:^(void){
                            view.frame = frame;
                        }
                     completion:^(BOOL finished){
                            [view removeFromSuperview];
                            //[self dismissViewControllerAnimated:NO completion:nil];//uncomment if need.
                     }];
}
你可以试试 [self.view layoutifneed]

像这样

- (void)callToDismissView:(UIView *)view {

 [self.view addSubview:view];

 [self dismissViewControllerAnimated:NO completion:nil];
 [self.view layoutIfNeeded];
 [UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^(void){

     CGRect frame = self.view.frame;
     frame.origin.x = frame.size.width;
     view.frame = frame;
     [self.view layoutIfNeeded];

 } completion:^(BOOL finished){

     [view removeFromSuperview];
 }];
 }

似乎根本没有办法在显示视图控制器中设置过渡动画,因此解决此问题的最简单方法是在显示视图控制器中设置过渡动画,然后将其取消。 我这样做的方式是将委托强制转换为视图控制器。然后就可以很容易地将其视图添加为当前视图控制器的子视图,并按如下方式设置动画:

- (void)dismissSelf {

    UIView *dummyView = [ScreenCapper captureScreenIn: self];
    UIViewController *presentingViewController = (UIViewController *)self.delegate;
    [self.view.window addSubview: presentingViewController.view];
    [self.view.window addSubview: dummyView];

    [UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^(void){

        dummyView.frame = CGRectMake(dummyView.frame.size.width, dummyView.frame.origin.y, dummyView.frame.size.width, dummyView.frame.size.height);

    } completion:^(BOOL finished){
        if (self.delegate && [self.delegate respondsToSelector:@selector(callToDismissView)]) {

            [self.delegate callToDismissView];
        }
    }];
}
在演示视图控制器中,剩下要做的就是在没有动画的情况下关闭演示视图控制器

- (void)callToDismissView {

    [self dismissViewControllerAnimated:NO completion:nil];
}

仍然会再现相同的问题。动画闭包正在调用,但持续时间始终被忽略。检查参数视图是否为零。新帧的原点已设置为self.view.frame.size.width,您无法看到动画结果。我已尝试使用view.frame.size.width/2,我可以在屏幕的一半看到它,因此我知道这不会是问题。我在新项目中使用上述代码没有问题。没有执行动画的原因有很多,需要添加问题的更多细节。谢谢回答Batuhan。不幸的是,我仍然遇到同样的问题。我尝试将frame.origin.x设置为frame.size.width/2,并注释掉[view removeFromSuperview],以确保调用了闭包,但视图仍会立即移动。这真的成了一个谜。对不起我的错,试着在动画持续时间块之前使用LayoutIfNeed。我一看到你的答案就试过了。不幸的是,它似乎不起作用。