滑动以从屏幕外移动容器视图控制器

时间:2013-11-28 20:13:19

标签: ios uiviewcontroller uistoryboard gesture

我有一个主视图控制器,在该视图控制器上有一点UIImageView。我希望能够滑动该图像视图并将包含的视图控制器幻灯片(动画)放到屏幕上,有点像拉动马尼拉文件夹的选项卡。

我已经尝试过各种方法来实现这一目标,但我找不到解决方案!特别是因为我希望新的视图控制器来自屏幕外,我正在使用故事板。

以下是视图控制器的正常状态:

用户应该能够滑动图像视图,从而在屏幕上滑动新的视图控制器。幻灯片动画的结尾应如下所示:

有谁知道如何实现这一目标?我不知道使用容器是否正确,但这只是我想出来的最佳方式。

2 个答案:

答案 0 :(得分:15)

这应该很容易。创建容器视图控制器。创建子视图控制器并控制 - 将嵌入segue从容器视图控制器拖动到子视图控制器。这将导致子视图控制器的视图在viewDidLoad期间安装在父视图中。

现在控制 - 从容器视图拖动到父视图控制器的头文件中以创建IBOutlet。

将容器视图拖离屏幕右侧。您还可以使用大小检查器来增加子视图的X坐标,直到它就在屏幕外。

现在将滑动手势识别器添加到父视图控制器的视图中,并将其连接到方法(我从手势识别器IBActions调用方法,即使它们不必是IBActions。)

在action方法中,使用UIView动画块减小容器视图框架的X坐标宽度。这会将它设置为屏幕上的动画。

(或者,您可以使用平移手势识别器作为其他海报建议,并在用户拖动时移动容器视图。如果您这样做,则必须添加仅将容器视图移动到右侧的代码,而不是上/下/左,并在它到达最终位置时停止移动。)

自动布局更新:


请注意,使用AutoLayout时,您应该使用约束来管理容器视图的位置。

您创建了一个约束,将视图放置在您想要的位置,然后从该约束控制拖动到您的代码中,以便为其创建出口。

然后,您可以向约束添加一个常量偏移,足以将容器视图推离屏幕(如果容器视图与屏幕的右边缘齐平,那么您只需添加容器的宽度查看contstraint常量,将视图向右移动宽度,然后在屏幕外。

当在屏幕上为视图设置动画时,你将约束常量设置回原始值(可能为零),然后在动画块中调用layoutIfNeeded。

目标C:

IBOutlet NSLayoutConstraint *containerViewXConstraint;

您更新的IBAction方法可能如下所示:

- (IBAction)slideView: (id) sender {
  containerViewXConstraint.constant = 0;  //Move the view on-screen
  [UIView animateWithDuration: 0.2
    animations: ^ {
      //animate the layout change
      [self.view layoutIfNeeded];
    }
  ]
}

在Swift 3中:

@IBAction func slideView(_ sender: AnyObject) {
  containerViewXConstraint.constant = 0  //Move the view on-screen
  UIViewanimateWithDuration(0.2) {
      //animate the layout change
      self.view.layoutIfNeeded()
    }
}

答案 1 :(得分:0)

您必须使用UIPanGestureRecognizer。您可以先将容器视图设置为屏幕外,然后跟踪用户的平移手势并相应地移动容器视图的frame.origin.x。