我有UIView,我想用旋转来制作动画。我也想使用自动布局。我已经看到了很多常见的问题,但我没有找到任何适用的解决方案。那么,让我们从我的界面和动画代码开始;我有一个带图像的UIView,它必须旋转。我现在有了旋转按钮。在屏幕截图中,你可以看到红十字,这一定是旋转中心(现在它在图像上,但我想在旋转的UIView之外创建旋转中心,我知道这可以用AnchorPoint存档)。
这是我的旋转动画代码:
#define ROTATE_DURATION 3.0
- (IBAction)rotateArrow {
CGAffineTransform transform = self.hand.transform;
NSLog(@"layer possition before animation x: %f; y: %f",self.hand.layer.position.x,self.hand.layer.position.y);
[UIView animateWithDuration:ROTATE_DURATION/3 delay:0.0 options:UIViewAnimationOptionCurveLinear animations:^{
self.hand.transform = CGAffineTransformRotate(transform, 2*M_PI/3) ;
[self.hand layoutIfNeeded];
NSLog(@"layer possition after animation 1 x: %f; y: %f",self.hand.layer.position.x,self.hand.layer.position.y);
}
completion:^(BOOL finished) {
[UIView animateWithDuration:ROTATE_DURATION/3 delay:0.0 options:UIViewAnimationOptionCurveLinear animations:^{
self.hand.transform = CGAffineTransformRotate(transform, -2*M_PI/3) ;
[self.hand layoutIfNeeded];
NSLog(@"layer possition after animation 2 x: %f; y: %f",self.hand.layer.position.x,self.hand.layer.position.y);
}
completion:^(BOOL finished) {
[UIView animateWithDuration:ROTATE_DURATION/3 delay:0.0 options:UIViewAnimationOptionCurveLinear animations:^{
self.hand.transform = CGAffineTransformRotate(transform, 0) ;
[self.hand layoutIfNeeded];
NSLog(@"layer possition after animation 3 x: %f; y: %f",self.hand.layer.position.x,self.hand.layer.position.y);
}
completion:^(BOOL finished) {
}];
}];
}];
}
所以,问题是什么:当旋转正在进行时,UIView会改变它的center
和layer.position
属性,这就是为什么我的UIView在动画时是“跳转”。如果自动布局被关闭,动画是可以的。我看了WWDC 2012“自动布局示例”,发现我会使用[self.handlayoutIfNeed];
都很好,但一点也不好。动画变得更流畅了一点,但我看到了这个“跳转”。所以,这是我的“输出”。
当它是动画时,UIView会像你在图像上看到的那样向右转,然后回到正常位置。我如何修复这个“跳跃”?
这是一份日志:
layer possition before animation x: 160.000000; y: 99.500000
layer possition after animation 1 x: 197.349030; y: 114.309601
layer possithtml" target="_blank">ion after animation 2 x: 197.349030; y: 114.309601
layer possition after animation 3 x: 160.000000; y: 99.500000
谢谢
解决办法是:
创建视图:
// Create container view
{
self.mContainerView = [[UIView alloc] init];
self.mContainerView.translatesAutoresizingMaskIntoConstraints = NO;
}
// Create view who will have the transform
{
self.mRotateView = [UIButton buttonWithType:UIButtonTypeCustom];
self.mRotateView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self.mContainerView addSubview:self.mRotateView];
}
处理转换:
{
CGFloat lAngle = 180.0;
[UIView animateWithDuration:0.5 delay:0.0 options: UIViewAnimationOptionAllowUserInteraction |UIViewAnimationOptionCurveLinear animations:^{
CGAffineTransform transform = CGAffineTransformMakeRotation(lAngle);
self.mRotateView.transform = transform;
} completion:NULL];
}
您可能会遇到autolayout和transforms之间的一般不兼容问题。查看这里的更多细节,但简单的说,您可能不想在正在转换的同一个视图上使用autolayout。
当我布局我的视图时,一切都开始正常工作。当你进行转换时,重要的是要记住,自动布局总是根据你设置的约束计算你的视图的边界和框架。所以,在我的例子中,我只是在旋转的视图中添加了中心垂直和水平对齐、宽度和高度,这样自动布局机制就知道我的视图在什么时候。一切都很好。这里有一个很好的自动布局教程:
http://www.raywenderlich.com/50319/beginning-auto-layout-tutorial-in-ios-7-part-1
使地球自动旋转,并控制旋转速率。地球的自动旋转功能在默认情况下是关闭的,如果启动旋转功能,默认的旋转速率是1。 // 启用自动旋转功能,将转速设置为1(同时1也是默认的转速) controller.setAutoRotation( true, 1 ); // 如果之前开启了自动旋转功能,可以用这种方式将其关闭 controller.setAutoRotation( false );
你可能用过UIViewAutoresizingMask类型的一些常量,应用于当父视图改变尺寸的时候,相应UIView的frame也跟着更新的场景(通常用于横竖屏切换)。 在iOS6中,苹果介绍了自动排版机制,它和自动调整不同,并且更加复杂。 在Mac OS平台,CALayer有一个叫做layoutManager的属性可以通过CALayoutManager协议和CAConst
我在警报对话框中有一个旋转器。我想减少旋转项之间的填充,因此我实现了以下内容: spinner_row.xml 活动代码包含以下内容: 按照Farrukh的建议,我尝试了他的代码,结果如下。
当我打开视图控制器时,我有一个从顶部飞出的视图。我已将UIView的Y约束设置为-200,当视图加载时,将调用以下内容,一切正常: 但是现在我有一个关闭按钮,它应该将动画回到-200位置,然后从屏幕上删除视图控制器。但是这个动画没有发生。视图控制器被直接删除。这是我正在做的: 我提到了这个链接。这似乎对他们有效,但对我无效。请帮忙。
我有一个自定义视图CustomLayout(蓝色,自定义UIView),该视图包含3个子视图,通过使用约束(布局锚定)垂直对齐,每个视图按照以下顺序对齐: 1视图:幻灯片(红色,自定义UIView) 我想,当我单击按钮(黄色)时,如果使用动画打开,SlideLayout(红色)的高度大小会增加,如果关闭,则会减少。和其他视图必须在动画期间更改位置,如果SlideLayout增加/减少,则父视图(C
我有一个自定义布局,如下所示。它有三个标签。 标签2是可选的。它并不存在于每个细胞中。因此,我想隐藏它,并将标签1向下移动一点,以便在发生这种情况时与标签3居中对齐。 以下是我为每个标签添加的约束。 标签1 标签 2 标签3 请注意,我添加了一个额外的约束,将中心与Y对齐,值为0的标签为1,并将其优先级设置为750。我想,如果我去掉标签2,优先级较低的约束将取代它的位置并下移。 但它似乎不起作用。