Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 旋转设备时,动画uiview将切换回其原始状态_Ios_Animation_Layout_Uiview_Rotation - Fatal编程技术网

Ios 旋转设备时,动画uiview将切换回其原始状态

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

我尝试在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 - 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),下面是我如何修复它的。

  • 首先,有一个全局静态变量,让我们称之为
    static BOOL\u isviewspilted
    它是静态的,因此当您按下或弹出ViewController时,它将保留在内存中

  • 从InterfaceOrientation重写didRotateFromInterfaceOrientation:(UIInterfaceOrientation) 在此处检查变量,如果是,则将其拆分。如果不是,则返回。

  • 此外,当弹出viewController时,您必须在
    视图中进行检查(如上所述)


我有一个类似的拆分视图(2个UITableView),下面是我如何修复它的。

  • 首先,有一个全局静态变量,让我们称之为
    static BOOL\u isviewspilted
    它是静态的,因此当您按下或弹出ViewController时,它将保留在内存中

  • 从InterfaceOrientation重写didRotateFromInterfaceOrientation:(UIInterfaceOrientation) 在此处检查变量,如果是,则将其拆分。如果不是,则返回。

  • 此外,当弹出viewController时,您必须在
    视图中进行检查(如上所述)


您可以通过对约束进行编码,然后设置它们的动画来修复此问题

类似这样的情况(此代码中的值与示例中的值不匹配):


您可以通过对约束进行编码,然后设置它们的动画来修复此问题

类似这样的情况(此代码中的值与示例中的值不匹配):


Tom,你最大的问题(IMHO)是你太频繁地调用你在问题中提供的代码。每次它都会将地图从全屏切换到拆分,因为它是从现在的位置做出决定的。你为什么不检查一下布尔ivar?您可以在按钮操作中翻转此选项以切换地图的全屏状态,如果您在“重新定向”等操作中重复调用此代码,则无所谓,只需将turnery运算符中的条件更改为新的布尔值,而不是查询地图是否全屏

Tom,这是您的大问题(IMHO)您正在调用您在问题中经常提供的代码。每次它都会将地图从全屏切换到拆分,因为它是从现在的位置做出决定的。你为什么不检查一下布尔ivar?你可以在你的按钮操作中翻转这个按钮来切换地图的全屏状态,如果你在重新定向时反复调用这个代码也没关系,只需将turnery操作符开头的条件更改为这个新的布尔值,而不是查询地图是否为全屏

如果旋转或屏幕导航后框架发生变化,则可能与视图控制器的布局方法有关,
ViewDidLayoutSubView
或生命周期方法
视图将出现:
ViewDidDisplay:
。如果重写这些方法,请检查它们的实现

由于使用“自动布局”,因此最好设置其约束的动画,而不是帧

据我所知,您的任务是移动地图的左侧以显示下方的表视图(打开/关闭状态)。使用autolayout,您的屏幕可能看起来很简单:

(UIImageView视图扮演地图的角色)

UITableView
约束

  • 恒定宽度约束
  • 顶部、前导和底部空间到superview约束设置为零
UIImageView
约束

  • 顶部、底部和尾部空间到superview约束设置为零
  • 超级视图的前导空间设置为表格宽度(打开状态,设置此约束的动画)
要实现所需的效果,我们需要设置前导空间到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;
}