Меню боковой панели слайдов IOS 8 Swift

Есть ли способ реализовать меню боковой панели слайдов (например, приложение Facebook) в IOS Swift без какой-либо сторонней библиотеки? Я ищу решения, но я только основал эту функцию, реализованную в Objective-C.

Я считаю, что вы можете запустить форму UISplitViewController, которая была резко обновлена ​​в iOS8. Сеансы просмотра Просмотр улучшений controllerа в iOS8 и создание адаптивных приложений с помощью UIKit для получения дополнительной информации. Они предоставляют пример кода из второго сеанса (но не формируют первый: /). На данный момент для меня естественно создать такой интерфейс, основанный на controllerе разделенного вида в iOS8.

Обновление: похоже, что не все API, о которых они говорят, все еще приземляются. В текущем бета-версии 4, упомянутой в видеоконденсатах, BarsOnSwipe не представлен, например.

Обновление . Пожалуйста, используйте мой обновленный ответ, а не этот. Существует множество краевых случаев с подходом Scrollview / Container View, который можно избежать, используя вместо этого Custom Transiler Transitions Transitions.

Я посмотрел повсюду в меню быстрого меню, которое не требовало библиотеки. Закончилось создание собственного учебника, которое довольно похоже на подход Фэнсона:

введите описание изображения здесь

Вот некоторые из основных моментов:

  • Создайте scrollview которая будет обрабатывать перемещение меню, а также жест панорамы
  • Поместите два вида container бок о бок, внутри scrollview . Контейнеры позволяют встроить controllerы верхнего уровня.
  • В scrollview настройте paging enabled но отключите bounces . Это приведет к усилению выхода в открытое или закрытое состояние
  • embed UITableViewController в левый контейнер
  • embed UITabBarController в правый контейнер
  • В правом container добавьте атрибут layer.shadowOpacity 0.8. Это дает вам свободный разделитель теней без кода.
  • Добавьте кнопку меню. Вы можете использовать NSNotificationCenter для связи с scrollview
  • Для секретного ингредиента: используйте scrollView.setContentOffset.x чтобы позаботиться о фактическом открытии и закрытии меню

Вот пример рабочего проекта приложения панели вкладок с левым меню выведения, включая скриншоты и инструкции.

https://github.com/ThornTechPublic/LeftSlideoutMenu

Наряду с более общим объяснением того, как это работает:

http://www.thorntech.com/2015/06/want-to-implement-a-slideout-menu-in-your-swift-app-heres-how/

Меню боковой панели слайдов для iOS7 и iOS8, Swift.

Если вы хотите его на уровне NavigationController (это означает, что для него есть все controllerы Al View):

https://github.com/evnaz/ENSwiftSideMenu

Если вы хотите его просто в одном ViewController :

Видео: https://www.youtube.com/watch?v=qaLiZgUK2T0

Исходный код: http://goo.gl/ULWxJh

В этом случае для совместимости с iOS7 просто добавьте это условие «если», где размещен комментарий «Добавить размытие», например:

 if (NSClassFromString("UIVisualEffectView") != nil) { // Add blur view let blurView:UIVisualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: UIBlurEffectStyle.Light)) blurView.frame = sideBarContainerView.bounds sideBarContainerView.addSubview(blurView) } 

Я думаю, что использование Custom View Controller Transitions – это надежный подход для создания слайд-меню:

  • Вы можете настроить анимацию.
  • Переход является интерактивным, поэтому вы можете перемещаться вперед и назад. Переход всегда заканчивается или откатывается назад и никогда не застревает между состояниями.
  • Для управления взаимодействием используются жесты «Жесты» и «Экранные frameworks». Это означает, что вы можете разместить их страtagsчески, чтобы минимизировать конфликт с горизонтальным жестовым контентом.
  • Вам не нужно прибегать к Container Views. Это означает, что ваша архитектура приложения более плоская, и вы можете использовать протокол-делегат вместо NSNotifications.
  • За один раз активен только один ViewController. Снимки используются, чтобы придать иллюзию, что на экране есть второй VC.

интерактивный слайд анимированный GIF

Пользовательский просмотр controllerа Переходы трудно освоить сначала (они были для меня, по крайней мере). Я написал сообщение в блоге о том, как создать интерактивное контекстное меню, и постарался изо всех сил сделать его максимально понятным.

Вы также можете перейти прямо в код на GitHub .

На очень высоком уровне, вот как это работает:

  1. Вы открываете слайд-меню в качестве модального.
  2. Вы создаете пользовательские анимации для настоящих и отклоняете переходы с использованием протокола UIViewControllerAnimatedTransitioning . Вы используете моментальный снимок для представления главного controllerа представления во время анимации.
  3. Вы создаете распознаватели жеста, чтобы представить / отклонить модально интерактивно.
  4. Вы UIPercentDrivenInteractiveTransition события «Жест» в объект UIPercentDrivenInteractiveTransition чтобы синхронизировать переход с движениями пользователя.
  5. Представляющий controller использует протокол UIViewControllerTransitioningDelegate и UIViewControllerTransitioningDelegate все пользовательские анимации и интерактивные переходы.

На самом деле у меня есть предыдущий ответ на этот stream, который использует Scrollview / Container View. Этот подход подходит для прототипа, но он запускается во множество случаев и ошибок при создании готового приложения. Расходы каждую неделю, отвечая на комментарии в блоге и фиксирующие крайние случаи, побудили меня написать вторую запись в блоге по этому вопросу.

Вот еще одна библиотека SideMenu, которую я сделал для добавления в микс: https://github.com/jonkykong/SideMenu .

Простое управление боковым меню для iOS в Swift, вдохновленное Facebook. Правая и левая стороны. Кодирование не требуется.

  • Он может быть реализован в раскадровке без единой строки кода.
  • Четыре стандартных стиля анимации на выбор (даже параллакс, если вы хотите получить странный).
  • Высоко настраиваемый без необходимости писать тонны настраиваемого кода.
  • Поддерживает непрерывное прокручивание между боковыми меню с обеих сторон одним жестом.
  • Глобальная конфигурация меню. Настройте один раз и сделайте все экраны.
  • Меню можно представить и отклонить так же, как и любой другой controller просмотра, поскольку этот элемент управления использует пользовательские переходы.

Вот небольшой пример того, как я это делаю, у этого элемента управления kernelм есть uiviewcontrollers для левого, центрального и правого. Это работает как приложение Slack IPad, где открыта одна или другая сторона.

 /* To use simply instantiate SlidingDrawerController as your root view in your AppDelegate, or in the StoryBoard. Once SlidingDrawerController is instantiated, set the drawerSize of the SlidingDrawerController, and its leftViewControllerIdentifier, centerViewControllerIdentifier, and rightViewControllerIdentifier to the Storyboard Identifier of the UIViewController you want in the different locations. */ class SlidingDrawerController: UIViewController { var drawerSize:CGFloat = 4.0 var leftViewControllerIdentifier:String = "leftViewController" var centerViewControllerIdentifier:String = "centerViewController" var rightViewControllerIdentifier:String = "rightViewController" enum Drawers { case left case right } private var _leftViewController:UIViewController? var leftViewController:UIViewController { get{ if let vc = _leftViewController { return vc; } return UIViewController(); } } private var _centerViewController:UIViewController? var centerViewController:UIViewController { get{ if let vc = _centerViewController { return vc; } return UIViewController(); } } private var _rightViewController:UIViewController? var rightViewController:UIViewController { get{ if let vc = _rightViewController { return vc; } return UIViewController(); } } static let SlidingDrawerOpenLeft = 1 static let SlidingDrawerOpenRight = 2 var openSide:SlidingDrawerController.Drawers { get{ return _openSide; } } private var _openSide = SlidingDrawerController.Drawers.left override func viewDidLoad() { super.viewDidLoad() // Instantiate VC's with storyboard ID's self._leftViewController = self.instantiateViewControllers(storyboardID: self.leftViewControllerIdentifier) self._centerViewController = self.instantiateViewControllers(storyboardID: self.centerViewControllerIdentifier) self._rightViewController = self.instantiateViewControllers(storyboardID: self.rightViewControllerIdentifier) self.drawDrawers(size: UIScreen.main.bounds.size) self.view.addSubview(self.leftViewController.view) self.view.addSubview(self.centerViewController.view) self.view.addSubview(self.rightViewController.view) } override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { coordinator.animateAlongsideTransition(in: self.view, animation: { (UIViewControllerTransitionCoordinatorContext) -> Void in // This is for beginning of transition self.drawDrawers(size: size) }, completion: { (UIViewControllerTransitionCoordinatorContext) -> Void in // This is for after transition has completed. }) } // MARK: - Drawing View func drawDrawers(size:CGSize) { // Calculate Center View's Size let centerWidth = (size.width/drawerSize) * (drawerSize - 1) // Left Drawer self.leftViewController.view.frame = CGRect(x: 0.0, y: 0.0, width: size.width/self.drawerSize, height: size.height) // Center Drawer self.centerViewController.view.frame = CGRect(x: self.leftViewController.view.frame.width, y: 0.0, width: centerWidth, height: size.height) // Right Drawer self.rightViewController.view.frame = CGRect(x: self.centerViewController.view.frame.origin.x + self.centerViewController.view.frame.size.width, y: 0.0, width: size.width/self.drawerSize, height: size.height) // Capture the Swipes let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(self.swipeRightAction(rec:))) swipeRight.direction = .right centerViewController.view.addGestureRecognizer(swipeRight) let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(self.swipeLeftAction(rec:))) swipeLeft.direction = .left centerViewController.view.addGestureRecognizer(swipeLeft) openDrawer(openSide) } // MARK: - Open Drawers func openDrawer(_ side:Drawers) { self._openSide = side var rect:CGRect switch side{ case .left: rect = CGRect( x: 0.0, y: 0.0, width: self.view.bounds.width, height: self.view.bounds.height ) case .right: rect = CGRect( x: self.view.bounds.origin.x - self.leftViewController.view.bounds.size.width, y: 0.0, width: self.view.bounds.width, height: self.view.bounds.height ) } UIView.animate(withDuration: 0.1, delay: 0, options: UIViewAnimationOptions.curveEaseIn, animations: { () -> Void in // move views here self.view.frame = rect }, completion: { finished in }) } // MARK: - Swipe Handling @objc func swipeRightAction(rec: UISwipeGestureRecognizer){ self.openDrawer(.left) } @objc func swipeLeftAction(rec:UISwipeGestureRecognizer){ self.openDrawer(.right) } // MARK: - Helpers func instantiateViewControllers(storyboardID: String) -> UIViewController { return UIStoryboard(name: "Main", bundle: nil) .instantiateViewController(withIdentifier: "\(storyboardID)") } } 

Источник здесь .

Изображение здесь .

Видео здесь .

Я реализовал его двумя способами.
Сначала используйте Scroll View и второй, используя Container Views .

Вы можете использовать TableViewController как меню в одном контейнере и TabBarController со скрытыми вкладками во втором контейнере. Нажатие Cell в виде таблицы перемещает вас на n-ю вкладку в панели вкладок.

Все, что вам нужно сделать, это анимировать верхний контейнер прямо при нажатии кнопки или в жесте. Тогда это может выглядеть так:

введите описание изображения здесь

То, что аккуратно, – это то, что вы можете легко добавить интересные эффекты, такие как анимация UIView, используя пружинное затухание, используя встроенные методы, чтобы придать ему реалистичный эффект. Вы также можете добавить тень к своему основному виду (не добавленному на картинке), чтобы сделать его похожим на страницу над меню.

  • Почему двойники печатаются по-разному в словарях?
  • Каков самый чистый способ применения map () для словаря в Swift?
  • Пользовательский навигатор ios 11 переходит в строку состояния
  • Является ли этот ответ от компилятора действительным?
  • Прецизионный строковый формат в Swift
  • Swift: Как использовать sizeof?
  • Быстрое изображение асинхронной загрузки
  • Почему мое возrotation ноль, но если я нажму url в chrome / safari, я могу получить данные?
  • Разница между == и ===
  • Оператор равенства Swift для вложенных массивов
  • В чем разница между функциями и закрытием?
  • Давайте будем гением компьютера.