我尝试在IOS7下制作一个小动画。我的 View Controller 有 2 个 View :一个 tableview 和一个 mapview。我有一个按钮,可以在“全屏显示 map ”和“显示 map 和表格 View ”状态之间切换。
这是我的实验代码:
float mapNewX = self.mapView.frame.origin.x == 0 ? 375 : 0;
float mapNewWidth = mapNewX == 0 ? self.view.frame.size.width : self.view.frame.size.width - mapNewX;
[UIView animateKeyframesWithDuration:0.1 delay:0.0 options:UIViewAnimationCurveEaseOut animations:^
{
CGRect mapViewFrame = self.mapView.frame;
mapViewFrame.origin.x = (mapNewX);
mapViewFrame.size.width = mapNewWidth;
self.mapView.frame = mapViewFrame;
}
completion:^(BOOL finished)
{
NSLog(@"OK");
}];
它可以工作,但是当我旋转我的设备时,它会切换回原始状态。所以,当我有完整的 map 显示时,当旋转设备时,它会在屏幕上切换回 tableview + mapview。
如果我通过导航 Controller 从另一个 View Controller 返回,也会发生同样的情况。如果我点击 map 图钉的详细信息披露,它会切换回原始布局。
我该怎么办?非常感谢!
更新:这里是旋转前后的截图(一些敏感数据被屏蔽了)
最佳答案
如果你在旋转或屏幕导航后丢失了框架变化,它可能与 View Controller 的布局方法有关 viewWillLayoutSubviews
, viewDidLayoutSubviews
或生命周期方法viewWillAppear:
, viewDidAppear:
.如果您覆盖它们,请检查这些方法的实现。
因为您使用自动布局,所以最好为其约束设置动画而不是框架。
据我了解,您的任务是移动 map 的左侧以显示下方的表格 View (打开/关闭状态)。使用自动布局,您的屏幕可能看起来像这样简单:
(UIImageView View 起到了 map 的作用)UITableView
约束
UIImageView
约束为了实现预期的效果,我们需要将前导空间设置为 super View 约束(在屏幕截图上选择)。我们为此约束创建一个导出并更改其
constant
属性为打开/关闭状态。@property (weak, nonatomic) IBOutlet NSLayoutConstraint *mapLeadingSpace;
在菜单出现在屏幕上之前设置菜单的初始状态。我们设置了默认值,但您可以从
NSUserDefaults
恢复适当的 bool 设置.- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.mapLeadingSpace.constant = 0; // default is closed
}
接下来,在按下条形按钮时切换动画。
- (IBAction)toggle:(id)sender
{
self.mapLeadingSpace.constant = self.mapLeadingSpace.constant == 0
? self.tableView.frame.size.width // opened
: 0; // closed
[UIView animateWithDuration:.2 animations:^{
[self.imageView layoutIfNeeded];
}];
}
关于ios - 旋转设备时,动画 uiview 切换回其原始状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21783285/