gpt4 book ai didi

ios - 摇动动画旋转显示以及动画

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:20:14 25 4
gpt4 key购买 nike

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

动画代码:

- (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];
}
}];
}

老实说,我对动画做的不多,所以我不知道我在这里做错了什么,更不用说我还应该尝试什么或者我应该在哪里寻找答案了。

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

最佳答案

问题是 View 上已经有一个非身份转换。为了使 View 在横向上正确显示,系统对其应用了一个旋转 View 的变换。只有当设备处于 UIDeviceOrientationPortrait 时, View 的转换才是 CGAffineTransformIdentity。此方向旋转仅适用于应用程序的根子项,即窗口的第一个 subview 。当您初始化翻译动画时:

CGAffineTransform translateRight = CGAffineTransformTranslate(CGAffineTransformIdentity, 0.0, t);

您是在告诉旋转的 View 忽略其旋转并在纵向模式下快速回到其方向。您可以通过执行以下两项操作之一来解决此问题:

  1. 使动画 View 成为 Root View 的 subview 。这样做的好处是系统仍将免费处理旋转,并且您的动画不会因方向更改而搞砸。而且最终代码会更加简单易维护。

  2. 存储 View 的初始转换,并将所有转换应用于它。

我会尝试在这里做#2。

- (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];
}
}];
}

注意 - 从 iOS 8 开始,UIWindow 的 Root View 不再在旋转时变换。相反,UIWindow 本身的边界发生了变化。有关此的另一个问题,请参见此处:UIWindow frame in ios 8 different from ios 7 in Landscape

关于ios - 摇动动画旋转显示以及动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19507942/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com