如何模仿iOS 10地图底部表单

任何人都可以告诉我怎样才能模仿在iOS 10的新地图应用程序的底部工作表?

在android中,你可以使用“BottomSheet”来模拟这种行为,但是我找不到像iOS那样的东西。

这是一个简单的滚动视图与内容embedded? 所以search栏在底部?

我对iOS编程相当新,所以如果有人能帮我创build这个布局,将不胜感激。

这是我的意思是“底部表”:

在这里输入图像说明 在这里输入图像说明

我不知道新地图应用的底部表单如何响应用户交互。 但是您可以创build一个自定义视图,看起来像截图中的视图,并将其添加到主视图。

我假设你知道如何:

1-通过故事板或使用xib文件创build视图控制器。

2-使用谷歌地图或苹果的MapKit。

1-创build2个视图控制器,例如MapViewControllerBottomSheetViewController 。 第一个控制器将主持地图,第二个控制器是底部表单本身。

configurationMapViewController

创build一个方法来添加底部工作表视图。

func addBottomSheetView() { // 1- Init bottomSheetVC let bottomSheetVC = BottomSheetViewController() // 2- Add bottomSheetVC as a child view self.addChildViewController(bottomSheetVC) self.view.addSubview(bottomSheetVC.view) bottomSheetVC.didMoveToParentViewController(self) // 3- Adjust bottomSheet frame and initial position. let height = view.frame.height let width = view.frame.width bottomSheetVC.view.frame = CGRectMake(0, self.view.frame.maxY, width, height) } 

并在viewDidAppear方法中调用它:

 override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) addBottomSheetView() } 

configurationBottomSheetViewController

1)准备背景

创build一个方法来添加模糊和活力效果

 func prepareBackgroundView(){ let blurEffect = UIBlurEffect.init(style: .Dark) let visualEffect = UIVisualEffectView.init(effect: blurEffect) let bluredView = UIVisualEffectView.init(effect: blurEffect) bluredView.contentView.addSubview(visualEffect) visualEffect.frame = UIScreen.mainScreen().bounds bluredView.frame = UIScreen.mainScreen().bounds view.insertSubview(bluredView, atIndex: 0) } 

在你的viewWillAppear中调用这个方法

 override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) prepareBackgroundView() } 

确保你的控制器的视图背景颜色是clearColor。

2)animationbottomSheet外观

 override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) UIView.animateWithDuration(0.3) { [weak self] in let frame = self?.view.frame let yComponent = UIScreen.mainScreen().bounds.height - 200 self?.view.frame = CGRectMake(0, yComponent, frame!.width, frame!.height) } } 

3)根据需要修改你的xib。

4)将Pan Gesture Recognizer添加到您的视图。

在你的viewDidLoad方法中添加UIPanGestureRecognizer。

 override func viewDidLoad() { super.viewDidLoad() let gesture = UIPanGestureRecognizer.init(target: self, action: #selector(BottomSheetViewController.panGesture)) view.addGestureRecognizer(gesture) } 

并执行你的手势行为:

 func panGesture(recognizer: UIPanGestureRecognizer) { let translation = recognizer.translationInView(self.view) let y = self.view.frame.minY self.view.frame = CGRectMake(0, y + translation.y, view.frame.width, view.frame.height) recognizer.setTranslation(CGPointZero, inView: self.view) } 

可滚动的底部图表:

如果您的自定义视图是滚动视图或任何其他inheritance的视图,那么您有两个select:

第一:

使用标题视图devise视图,并将panGesture添加到标题。 (糟糕的用户体验)

第二:

1 – 将panGesture添加到底部工作表视图。

2 – 实现UIGestureRecognizerDelegate并将panGesture委托设置为控制器。

3-实现shouldRecognizeSimultaneouslyWith委托函数并禁用 scrollView isScrollEnabled属性在两种情况下:

  • 视图是部分可见的。
  • 视图完全可见,scrollView的contentOffset属性为0,用户向下拖动视图。

否则启用滚动。

  func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { let gesture = (gestureRecognizer as! UIPanGestureRecognizer) let direction = gesture.velocity(in: view).y let y = view.frame.minY if (y == fullView && tableView.contentOffset.y == 0 && direction > 0) || (y == partialView) { tableView.isScrollEnabled = false } else { tableView.isScrollEnabled = true } return false } 

注意

如果将.allowUserInteraction设置为animation选项(如示例项目中所示),则需要在用户向上滚动时启用animation完成闭合的滚动。

示例项目

我创build了一个样本项目,在这个回购中有更多的select,可以给你更好的见解如何定制stream程。

在演示中,addBottomSheetView()函数控制哪个视图应该用作底部表单。

示例项目截图

– 部分视图

在这里输入图像说明

– FullView

在这里输入图像说明

– 可滚动视图

在这里输入图像说明

尝试滑轮

滑轮是一个易于使用的抽屉库,旨在模仿iOS 10的地图应用程序中的抽屉。 它公开了一个简单的API,允许您使用任何UIViewController子类作为抽屉内容或主要内容。

滑轮预览

https://github.com/52inc/Pulley