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

标签 ios animation layout uiview rotation

我尝试在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 图钉的详细信息披露,它会切换回原始布局。

我该怎么办?非常感谢!

更新:这里是旋转前后的截图(一些敏感数据被屏蔽了)

enter image description here

enter image description here

最佳答案

如果你在旋转或屏幕导航后丢失了框架变化,它可能与 View Controller 的布局方法有关 viewWillLayoutSubviews , viewDidLayoutSubviews或生命周期方法viewWillAppear: , viewDidAppear: .如果您覆盖它们,请检查这些方法的实现。

因为您使用自动布局,所以最好为其约束设置动画而不是框架。

据我了解,您的任务是移动 map 的左侧以显示下方的表格 View (打开/关闭状态)。使用自动布局,您的屏幕可能看起来像这样简单:

enter image description here

(UIImageView View 起到了 map 的作用)
UITableView约束

  • 恒定宽度约束
  • super View 约束的顶部、前导和底部空间设置为零
  • UIImageView约束
  • 将 super View 约束设置为零的顶部、底部和尾随空间
  • 前导空格到 监督 设置为表格宽度(打开状态,为此约束设置动画)

  • 为了实现预期的效果,我们需要将前导空间设置为 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/

    相关文章:

    iOS - 导航栏内的动画不起作用

    html - IE 11 不显示 Adob​​e Edge HTML5 动画

    java - 如何使 MiGLayout 的行为像 Wrap Layout?

    gridview - Flutter:在 GridView 下方添加项目

    iPhone PLIST 文件上传即将推出二进制文件

    ios - 在 block 中引用 iOS 应用程序委托(delegate)是否会创建委托(delegate)对象的副本?

    android - 修复了 jQuery Mobile 中的标题滚动/拖动

    Javascript 多动画表

    java - 表格布局问题

    ios - 将标签的内容从一个 View Controller 传送到另一个 View Controller