Xcode 6和Swift视图之间的类似Snapchat的滑动导航)

我一直在尝试在我的应用程序中使用滑动手势识别器和embedded的导航控制器实现在视图控制器之间的滑动导航,但它看起来甚至不接近Snapchat的导航。

什么是最有效和适当的方式来实现这样的function?

我是Swift和编程的新手,我很感激每一个有用的评论。

简短的版本是使用控制器内的滚动视图的容器视图控制器。 然后为应用程序中的每个屏幕创build单独的视图控制器,并使这些视图控制器的父容器视图控制器。

在这里可以find带有示例代码的github回购。

你需要一个pageviewcontroller。 这本来是为了显示教程和东西,但你可以把视图控制器在那里。 这里有大量的教程,基本上你必须运用一点逻辑来告诉程序接下来要显示的视图控制器。

这是一个非常先进的例子,但它可能对你有帮助:

https://github.com/cwRichardKim/RKSwipeBetweenViewControllers

我不喜欢lbrendanl给出的版本,因为它不使用约束。 我们无法像我们想要的那样定制它。 这里是相同的版本,但有约束:

scrollView是一个IBOutlet,通过4个约束条件与控制器相连,控制器的每一边都有一个常数为0的控制器。

contentView也是一个IBOutlet,作为scrollView的子视图添加到scrollView中,每个边都有一个常量为0的4个约束。 它也有一个相等的高度约束和宽度相等的约束。 宽度相等的约束在运行时被删除,仅用于平息IB。 这个视图代表了scrollView的contentView。

更新iOS 9

  func setupDetailViewControllers() { var previousController: UIViewController? for controller in self.controllers { addChildViewController(controller) addControllerInContentView(controller, previousController: previousController) controller.didMoveToParentViewController(self) previousController = controller } } func addControllerInContentView(controller: UIViewController, previousController: UIViewController?) { contentView.addSubview(controller.view) controller.view.translatesAutoresizingMaskIntoConstraints = false // top controller.view.topAnchor.constraintEqualToAnchor(contentView.topAnchor).active = true // bottom controller.view.bottomAnchor.constraintEqualToAnchor(contentView.bottomAnchor).active = true // trailing trailingContentViewConstraint?.active = false trailingContentViewConstraint = controller.view.trailingAnchor.constraintEqualToAnchor(contentView.trailingAnchor) trailingContentViewConstraint?.active = true // leading let leadingAnchor = previousController?.view.trailingAnchor ?? contentView.leadingAnchor controller.view.leadingAnchor.constraintEqualToAnchor(leadingAnchor).active = true // width controller.view.widthAnchor.constraintEqualToAnchor(scrollView.widthAnchor).active = true } 

先前的回答

  class ContainerViewController: UIViewController { @IBOutlet var scrollView: UIScrollView! @IBOutlet var contentView: UIView! // A strong reference to the width contraint of the contentView var contentViewConstraint: NSLayoutConstraint! // A computed version of this reference var computedContentViewConstraint: NSLayoutConstraint { return NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: scrollView, attribute: .Width, multiplier: CGFloat(controllers.count + 1), constant: 0) } // The list of controllers currently present in the scrollView var controllers = [UIViewController]() override func viewDidLoad() { super.viewDidLoad() initScrollView() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } func initScrollView(){ contentView.setTranslatesAutoresizingMaskIntoConstraints(false) contentViewConstraint = computedContentViewConstraint view.addConstraint(contentViewConstraint) // Adding all the controllers you want in the scrollView let controller1 = storyboard!.instantiateViewControllerWithIdentifier("AStoryboardID") as! AnUIControllerViewSubclass addToScrollViewNewController(controller) let controller2 = storyboard!.instantiateViewControllerWithIdentifier("AnotherStoryboardID") as! AnotherUIControllerViewSubclass addToScrollViewNewController(controller2) } // The main method, adds the controller in the scrollView at the left of the previous controller added func addToScrollViewNewController(controller: UIViewController) { self.addChildViewController(controller) contentView.addSubview(controller.view) controller.view.setTranslatesAutoresizingMaskIntoConstraints(false) // Setting all the constraints let bottomConstraint = NSLayoutConstraint(item: contentView, attribute: .Bottom, relatedBy: .Equal, toItem: controller.view, attribute: .Bottom, multiplier: 1.0, constant: 0) let topConstraint = NSLayoutConstraint(item: contentView, attribute: .Top, relatedBy: .Equal, toItem: controller.view, attribute: .Top, multiplier: 1.0, constant: 0) let widthConstraint = NSLayoutConstraint(item: controller.view, attribute: .Width, relatedBy: .Equal, toItem: scrollView, attribute: .Width, multiplier: 1.0, constant: 0) var trailingConstraint: NSLayoutConstraint! if controllers.isEmpty { // Since it's the first one, the trailing constraint is from the controller view to the contentView trailingConstraint = NSLayoutConstraint(item: contentView, attribute: .Trailing, relatedBy: .Equal, toItem: controller.view, attribute: .Trailing, multiplier: 1.0, constant: 0) } else { trailingConstraint = NSLayoutConstraint(item: controllers.last!.view, attribute: .Leading, relatedBy: .Equal, toItem: controller.view, attribute: .Trailing, multiplier: 1.0, constant: 0) } // Setting the new width constraint of the contentView view.removeConstraint(contentViewConstraint) contentViewConstraint = computedContentViewConstraint // Adding all the constraints to the view hierarchy view.addConstraint(contentViewConstraint) contentView.addConstraints([bottomConstraint, topConstraint, trailingConstraint]) scrollView.addConstraints([widthConstraint]) controller.didMoveToParentViewController(self) // Finally adding the controller in the list of controllers controllers.append(controller) } } 

我以前使用过lbrendanl的版本。 现在我更喜欢这个。 告诉我你对它的想法。

我build议使用UIPageViewController并通过删除这些方法来隐藏点条:

 presentationCountForPageViewController presentationIndexForPageViewController 

这是一个很好的教程:

https://www.youtube.com/watch?v=8bltsDG2ENQ

这是一个很好的回购:

https://github.com/goktugyil/EZSwipeController

分页滚动查看,而不是在Snapchat情况下的PageViewController。

您可以尝试使用CATransition创build滑动animation。 下面是一个如何从一个视图滑动到另一个视图的例子:

  UIView *parentView = [self.view superview]; CATransition *animation = [CATransition animation]; [animation setDuration:0.25]; [animation setType:kCATransitionPush]; [animation setSubtype:kCATransitionFromLeft]; [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; [parentView addSubview:yourSecondViewController.view]; [self.view removeFromSuperview]; [[theParentView layer] addAnimation:animation forKey:@"showSecondViewController"]; 

我在这里find了一些代码: 如何在视图之间实现滑动/滑动animation?

我有类似的要求,最初实施与PageController ,但后来我已经将其更改为UICollectionView其中每个单元格是全屏和滚动设置为水平。