连续两次动画后定位失败
Positioning failure after two consecutive animations
我正在我的应用程序中创建一个由多个按钮和图像组成的相当简单的动画。基本上它看起来像一个展开的菜单。
我使用自动布局故事板来管理视图,并且设置了适当的约束,因此它在每个设备上看起来都一样。
我有两个按钮和这些按钮上的两个图像,第一次显示时,
NSLog(@"Button position is %@", NSStringFromCGRect(_toclass.frame));
NSLog(@"Image position is %@", NSStringFromCGRect(_revel2.frame));
我得到答案:按钮位置是 {{0, 153}, {600, 133}},图像位置是 {{254, 179}, {92, 60}}。
我设置了以下变量并执行了第一个动画:
Hprofile = 20;
Hclass = 153;
Htuto = 2 * Hclass;
Hicones = 26;
[UIView animateWithDuration:1.2
delay:0
options:(UIViewAnimationOptions) UIViewAnimationCurveEaseInOut
animations:^{
[_toclass setFrame:CGRectMake(0, -Htuto, self.view.bounds.size.width, _toclass.frame.size.height)];
[_revel2 setFrame:CGRectMake(_revel2.frame.origin.x, -Htuto+Hicones, 92, 60)];
}
completion:^(BOOL finished){
}];
完成此动画(效果很好)后,您可以使用另一个按钮返回到之前的设置:
[UIView animateWithDuration:1
delay:0
options:(UIViewAnimationOptions) UIViewAnimationCurveEaseInOut
animations:^{
[_toclass setFrame:CGRectMake(0, Hclass, self.view.bounds.size.width, 133)];
[_revel2 setFrame:CGRectMake(_revel2.frame.origin.x, Hclass+Hicones, 92, 60)];
}
completion:^(BOOL finished){
NSLog(@"Button position is %@", NSStringFromCGRect(_toclass.frame));
NSLog(@"Image position is %@", NSStringFromCGRect(_revel2.frame));
}];
在此动画之后,按钮位于正确的位置,但图像不在。
我得到答案:按钮位置是 {{0, 123}, {320, 102.5}} 图像位置是 {{114, 179}, {92, 60}}.
我想在动画和自动布局约束之间存在一些冲突,但我无法弄清楚。
求助!
感谢您的宝贵时间。
如果您使用的是自动布局,则不应再更改框架,而应使用约束。
据我从您的代码中了解到,您想上下移动按钮和图像。正确的方法是从情节提要中的顶部偏移约束(对于按钮和图像)创建一个 IBOutlet 并更改它们的常量以使其适合您的动画。
类似这样的东西而不是第一帧修改。
[UIView animateWithDuration:1.2
delay:0
options:(UIViewAnimationOptions) UIViewAnimationCurveEaseInOut
animations:^{
[self.buttonTopOffsetConstraint setConstant:-Htuto];
[self.imageTopOffsetConstraint setConstant:(-Htuto+Hicones)];
[self.view layoutIfNeeded];
}];
如果您需要更多帮助或有什么不清楚的地方,请告诉我。祝你好运!
我正在我的应用程序中创建一个由多个按钮和图像组成的相当简单的动画。基本上它看起来像一个展开的菜单。
我使用自动布局故事板来管理视图,并且设置了适当的约束,因此它在每个设备上看起来都一样。
我有两个按钮和这些按钮上的两个图像,第一次显示时,
NSLog(@"Button position is %@", NSStringFromCGRect(_toclass.frame));
NSLog(@"Image position is %@", NSStringFromCGRect(_revel2.frame));
我得到答案:按钮位置是 {{0, 153}, {600, 133}},图像位置是 {{254, 179}, {92, 60}}。
我设置了以下变量并执行了第一个动画:
Hprofile = 20;
Hclass = 153;
Htuto = 2 * Hclass;
Hicones = 26;
[UIView animateWithDuration:1.2
delay:0
options:(UIViewAnimationOptions) UIViewAnimationCurveEaseInOut
animations:^{
[_toclass setFrame:CGRectMake(0, -Htuto, self.view.bounds.size.width, _toclass.frame.size.height)];
[_revel2 setFrame:CGRectMake(_revel2.frame.origin.x, -Htuto+Hicones, 92, 60)];
}
completion:^(BOOL finished){
}];
完成此动画(效果很好)后,您可以使用另一个按钮返回到之前的设置:
[UIView animateWithDuration:1
delay:0
options:(UIViewAnimationOptions) UIViewAnimationCurveEaseInOut
animations:^{
[_toclass setFrame:CGRectMake(0, Hclass, self.view.bounds.size.width, 133)];
[_revel2 setFrame:CGRectMake(_revel2.frame.origin.x, Hclass+Hicones, 92, 60)];
}
completion:^(BOOL finished){
NSLog(@"Button position is %@", NSStringFromCGRect(_toclass.frame));
NSLog(@"Image position is %@", NSStringFromCGRect(_revel2.frame));
}];
在此动画之后,按钮位于正确的位置,但图像不在。 我得到答案:按钮位置是 {{0, 123}, {320, 102.5}} 图像位置是 {{114, 179}, {92, 60}}.
我想在动画和自动布局约束之间存在一些冲突,但我无法弄清楚。
求助!
感谢您的宝贵时间。
如果您使用的是自动布局,则不应再更改框架,而应使用约束。
据我从您的代码中了解到,您想上下移动按钮和图像。正确的方法是从情节提要中的顶部偏移约束(对于按钮和图像)创建一个 IBOutlet 并更改它们的常量以使其适合您的动画。
类似这样的东西而不是第一帧修改。
[UIView animateWithDuration:1.2
delay:0
options:(UIViewAnimationOptions) UIViewAnimationCurveEaseInOut
animations:^{
[self.buttonTopOffsetConstraint setConstant:-Htuto];
[self.imageTopOffsetConstraint setConstant:(-Htuto+Hicones)];
[self.view layoutIfNeeded];
}];
如果您需要更多帮助或有什么不清楚的地方,请告诉我。祝你好运!