Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.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 抖动动画旋转显示以及设置动画_Ios_Animation_Cgaffinetransform_Quartz Core - Fatal编程技术网

Ios 抖动动画旋转显示以及设置动画

Ios 抖动动画旋转显示以及设置动画,ios,animation,cgaffinetransform,quartz-core,Ios,Animation,Cgaffinetransform,Quartz Core,我有一个方法来执行小抖动动画。这个动画有些效果,但每次我从横向位置调用它时,它都会旋转。当模拟器处于横向时调用动画时,整个视图将自身旋转为纵向,然后执行动画。旋转本身没有设置动画,它只是突然改变,没有延迟。视图中的所有内容、所有按钮、文本字段、图像视图等也会发生变化 动画代码: - (void)shakeView { CGFloat t = 8.0; CGAffineTransform translateRight = CGAffineTransformTranslate(

我有一个方法来执行小抖动动画。这个动画有些效果,但每次我从横向位置调用它时,它都会旋转。当模拟器处于横向时调用动画时,整个视图将自身旋转为纵向,然后执行动画。旋转本身没有设置动画,它只是突然改变,没有延迟。视图中的所有内容、所有按钮、文本字段、图像视图等也会发生变化

动画代码:

- (void)shakeView
{   
    CGFloat t = 8.0;
    CGAffineTransform translateRight = CGAffineTransformTranslate(CGAffineTransformIdentity, 0.0, t);
    CGAffineTransform translateLeft = CGAffineTransformTranslate(CGAffineTransformIdentity, 0.0, -t);

    self.view.transform = translateLeft;

    [UIView animateWithDuration:0.07 delay:0.0 options:UIViewAnimationOptionAutoreverse|UIViewAnimationOptionRepeat animations:^{[UIView setAnimationRepeatCount:3.0];

        self.view.transform = translateRight;
    }
        completion:^(BOOL finished){
        if (finished)
            {
                [UIView animateWithDuration:0.05 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{self.view.transform = CGAffineTransformIdentity;
            }
        completion:NULL];
        }
    }];
}
老实说,我不太喜欢动画,所以我不知道我在这里做错了什么,更不用说我应该尝试什么或者在哪里寻找答案了


我希望在保持方向的同时保持动画。

问题是视图上已经有了非标识变换。为了使视图在横向中正确显示,系统会对其应用变换以旋转视图。仅当设备位于UIDeviceOrientationGrait中时,视图的转换才为CGAffineTransformity。此方向旋转仅适用于应用程序的根子级,即窗口的第一个子视图。使用以下命令初始化翻译动画时:

CGAffineTransform translateRight = CGAffineTransformTranslate(CGAffineTransformIdentity, 0.0, t);
您告诉旋转视图忽略其旋转,并在纵向模式下捕捉回其方向。您可以通过执行以下两项操作之一来解决此问题:

  • 使动画视图成为根视图的子视图。这样做的好处是,系统仍将免费处理旋转,并且动画不会因为方向更改而导致错误。此外,最终代码将更简单,更易于维护

  • 存储视图的初始转换,并对其应用所有转换

  • 我在这里试着做2件事


    注意-从iOS 8开始,UI窗口的根视图不再在旋转时变换。相反,UIWindow本身的边界会发生变化。有关这方面的另一个问题,请参见此处:

    我看不出有任何问题..它完全可以正常工作。。。您的代码的其他部分可能有问题。@Xman,您是否在横向中运行了动画?我的整个UIView、所有按钮、文本字段和图像视图都会在模拟器处于横向时翻转为纵向。我在两种模式下运行了它。因此,我最终使用了此处给出的动画:。但上述代码尚未修复。
    - (void)shakeView
    {   
        CGFloat t = 8.0;
    
        //store the initial transform and use it to create the animated transforms
        CGAffineTransform initialTransform = self.view.transform;
        CGAffineTransform translateRight = CGAffineTransformTranslate(initialTransform, 0.0, t);
        CGAffineTransform translateLeft = CGAffineTransformTranslate(initialTransform, 0.0, -t);
    
        self.view.transform = translateLeft;
    
        [UIView animateWithDuration:0.07 
                              delay:0.0 
                            options:UIViewAnimationOptionAutoreverse|UIViewAnimationOptionRepeat 
                         animations:^{
            [UIView setAnimationRepeatCount:3.0];
    
            self.view.transform = translateRight;
                                    }
                         completion:^(BOOL finished){
            if (finished)
            {
                [UIView animateWithDuration:0.05 
                                      delay:0.0 
                                    options:UIViewAnimationOptionBeginFromCurrentState 
                                 animations:^{
                    //restore the initial transform
                    self.view.transform = initialTransform;
                                             }
                                 completion:NULL];
            }
        }];
    }