Ios 旋转设备时,动画uiview将切换回其原始状态
我尝试在IOS7下制作一个小动画。“我的视图”控制器有两个视图:tableview和mapview。我有一个按钮,可以在“显示地图全屏”和“显示地图和表格视图”状态之间切换 以下是我的实验代码:Ios 旋转设备时,动画uiview将切换回其原始状态,ios,animation,layout,uiview,rotation,Ios,Animation,Layout,Uiview,Rotation,我尝试在IOS7下制作一个小动画。“我的视图”控制器有两个视图:tableview和mapview。我有一个按钮,可以在“显示地图全屏”和“显示地图和表格视图”状态之间切换 以下是我的实验代码: float mapNewX = self.mapView.frame.origin.x == 0 ? 375 : 0; float mapNewWidth = mapNewX == 0 ? self.view.frame.size.width : self.view.frame.size.width
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");
}];
它可以工作,但当我旋转设备时,它会切换回原始状态。所以,当我有完整的地图显示时,当旋转设备时,它会在屏幕上切换回tableview+mapview
如果我通过导航控制器从另一个视图控制器返回,也会发生同样的情况。如果我点击地图引脚的详细信息,它会切换回原始布局
我该怎么办?非常感谢
更新:以下是旋转前后的屏幕截图(一些敏感数据被屏蔽)
使用
-(void)从InterfaceOrientation(接口方向)中删除了RotateFromInterfaceOrientation:(UIInterfaceOrientation)
创建一个变量来指示它是全屏地图还是分割视图,然后在旋转完成后运行例程?不确定这是一个多么高科技的解决方案,但我会这么做的!:) 使用
-(void)从InterfaceOrientation(接口方向)中删除了RotateFromInterfaceOrientation:(UIInterfaceOrientation)
创建一个变量来指示它是全屏地图还是分割视图,然后在旋转完成后运行例程?不确定这是一个多么高科技的解决方案,但我会这么做的!:) 我有一个类似的拆分视图(2个UITableView),下面是我如何修复它的。
- 首先,有一个全局静态变量,让我们称之为
它是静态的,因此当您按下或弹出ViewController时,它将保留在内存中static BOOL\u isviewspilted
- 从InterfaceOrientation重写didRotateFromInterfaceOrientation:(UIInterfaceOrientation)
在此处检查变量,如果是,则将其拆分。如果不是,则返回。
- 此外,当弹出viewController时,您必须在
视图中进行检查(如上所述)
- 首先,有一个全局静态变量,让我们称之为
它是静态的,因此当您按下或弹出ViewController时,它将保留在内存中static BOOL\u isviewspilted
- 从InterfaceOrientation重写didRotateFromInterfaceOrientation:(UIInterfaceOrientation)
在此处检查变量,如果是,则将其拆分。如果不是,则返回。
- 此外,当弹出viewController时,您必须在
视图中进行检查(如上所述)
您可以通过对约束进行编码,然后设置它们的动画来修复此问题 类似这样的情况(此代码中的值与示例中的值不匹配):
Tom,你最大的问题(IMHO)是你太频繁地调用你在问题中提供的代码。每次它都会将地图从全屏切换到拆分,因为它是从现在的位置做出决定的。你为什么不检查一下布尔ivar?您可以在按钮操作中翻转此选项以切换地图的全屏状态,如果您在“重新定向”等操作中重复调用此代码,则无所谓,只需将turnery运算符中的条件更改为新的布尔值,而不是查询地图是否全屏Tom,这是您的大问题(IMHO)您正在调用您在问题中经常提供的代码。每次它都会将地图从全屏切换到拆分,因为它是从现在的位置做出决定的。你为什么不检查一下布尔ivar?你可以在你的按钮操作中翻转这个按钮来切换地图的全屏状态,如果你在重新定向时反复调用这个代码也没关系,只需将turnery操作符开头的条件更改为这个新的布尔值,而不是查询地图是否为全屏如果旋转或屏幕导航后框架发生变化,则可能与视图控制器的布局方法有关,
ViewDidLayoutSubView
或生命周期方法视图将出现:
,ViewDidDisplay:
。如果重写这些方法,请检查它们的实现
由于使用“自动布局”,因此最好设置其约束的动画,而不是帧
据我所知,您的任务是移动地图的左侧以显示下方的表视图(打开/关闭状态)。使用autolayout,您的屏幕可能看起来很简单:
(UIImageView视图扮演地图的角色)
UITableView
约束
- 恒定宽度约束
- 顶部、前导和底部空间到superview约束设置为零
UIImageView
约束
- 顶部、底部和尾部空间到superview约束设置为零
- 超级视图的前导空间设置为表格宽度(打开状态,设置此约束的动画)
常量
属性更改为打开/关闭状态
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *mapLeadingSpace;
在菜单出现在屏幕上之前设置其初始状态。我们设置了默认值,但您可以从NSUserDefaults
恢复适当的布尔设置
- (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];
}];
}
如果在旋转或屏幕导航后出现框架更改,则可能与视图控制器的布局方法
viewWillLayoutSubviews
,viewdillayoutsubviews
或生命周期方法有关
- (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];
}];
}
// update constraints…
[UIView animateWithDuration:0.5 animations:^{
[self.view layoutIfNeeded];
}];
if ([self respondsToSelector:@selector(edgesForExtendedLayout)]) {
self.edgesForExtendedLayout = UIRectEdgeNone;
}