Swift Presenting Controller Dismiss Bar Индикатор

Это должен быть простой вопрос для большинства из вас. Представление контроллеров представления, как на прикрепленной фотографии, теперь имеет полосу в верхней части (см. красную стрелку), указывающую, что пользователь может провести пальцем вниз, чтобы закрыть контроллер. Пожалуйста, помогите с любым из следующих вопросов:

  • Как правильно назвать эту икону?
  • Является ли это частью инструментов/библиотеки пользовательского интерфейса Swift или это просто UIImage?
  • Может кто-нибудь предоставить простой фрагмент о том, как реализовать - возможно, это что-то похожее на код ниже
let sampleController = SampleController()
sampleController.POSSIBLE_OPTION_TO_SHOW_BAR_ICON = true
present(sampleController, animated: true, completion: nil)

Пожалуйста, обратите внимание на красную стрелку для значка, о котором я говорю

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


person teamvtechnology    schedule 14.10.2019    source источник
comment
Вы нашли решение для этого требования? В настоящее время я ищу решение для точно такого же требования, как и ваше.   -  person loongman    schedule 14.05.2020
comment
Эх, не совсем. Я узнал, что вам нужно создать это самостоятельно и что оно не является частью пользовательского интерфейса/библиотеки Swift. Однако я так и не узнал, как называется имя иконы. Если вы обнаружите это, пожалуйста, дайте мне знать.   -  person teamvtechnology    schedule 15.05.2020
comment
Я реализовал эту функцию, следуя инструкциям на fluffy.es/facebook-draggable- нижняя-карточка-модальная-1 и fluffy.es/facebook -draggable-bottom-card-modal-2 К вашему сведению.   -  person loongman    schedule 20.05.2020
comment
Спасибо @loongman. Это отличная статья, но у меня есть один вопрос. В шаге 7 упоминается добавление представления пользовательского интерфейса в качестве представления дескриптора. Это для меня ответ на нашу иконку, но не сказано, как это сделать. Как добавить представление пользовательского интерфейса в качестве представления дескриптора? Ниже ссылка на это изображение с этим. iosimage.s3.amazonaws.com/2019/62-bottom- карта/step7.png   -  person teamvtechnology    schedule 21.05.2020
comment
В моем случае представление Handle было добавлено как обычный UIView с размером (36, 4), угловым радиусом (2) и определенным backgroundColor в затемненное представление. И закрепите представление карты снизу вверх, поэтому всякий раз, когда представление карты прокручивается, представление ручки также прокручивается.   -  person loongman    schedule 25.05.2020


Ответы (2)


Функция, которую вы запрашиваете, недоступна в UIKit.

Вы должны реализовать пользовательскую анимацию перехода контроллера представления с подклассом UIPresentationController для рендеринга этого дескриптора подъема/опускания.

UIPresentationController (developer.apple.com)

Для пользовательских презентаций вы можете предоставить свой собственный контроллер презентации, чтобы придать представленному контроллеру представления настраиваемый внешний вид. Контроллеры презентации управляют любым пользовательским хромом, который отделен от контроллера представления и его содержимого. Например, представление с затемнением, расположенное за представлением контроллера представления, будет управляться контроллером представления. Документация Apple

Это может быть достигнуто с помощью любого UIView или вы можете использовать любое изображение, если хотите, добавив подпредставление в contentView UIPresentationController над presentedView.

Чтобы предоставить жест смахивания для закрытия/представления, вы должны реализовать UIPercentDrivenInteractionController.

Вы можете обратиться к этому руководству ниже для подробного понимания.

Учебное пособие по UIPresentationController Автор: raywenderlich.com

Вы должны искать presentationDirection = .bottom в вашем случае.

Для увольнения с помощью жестов вы должны проверить приведенный ниже учебник.

Custom-UIViewcontroller-Transitions-getting-started

Я надеюсь, что это может помочь вам.

person Ratnesh Jain    schedule 15.10.2019

Если вам нужно добавить этот индикатор внутри представленного контроллера представления, если вы не хотите делать какие-либо пользовательские презентации и просто работать с переходами по умолчанию.

Первое, о чем нужно подумать, это иерархия вашего представления, будет ли индикатор частью вашей панели навигации, или, возможно, у вашего представления нет панели навигации, поэтому, соответственно, вам, вероятно, понадобится какой-то код, чтобы найти правильное представление для добавления этого индикатора.

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

1: Подкласс контроллера навигации

Это необязательно, но было бы неплохо перенести всю эту настройку в навигационный контроллер.

Я проверяю, представлен ли NavigationController. Это может быть не лучший способ проверить, но, поскольку это не является частью вопроса, обратитесь к эти ответы, чтобы проверить, был ли представлен контроллер представления модально или нет

class CustomNavigationController: UINavigationController {
  override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    
    // this checks if the ViewController is being presented
    if presentingViewController != nil {
      addModalIndicator()
    }
  }

  private func addModalIndicator() {
    let indicator = UIView()
    indicator.backgroundColor = .tertiaryLabel
    let indicatorSize = CGSize(width: 30, height: 5)
    let indicatorX = (navigationBar.frame.width - indicatorSize.width) / CGFloat(2)
    indicator.frame = CGRect(origin: CGPoint(x: indicatorX, y: 8), size: indicatorSize)
    indicator.layer.cornerRadius = indicatorSize.height / CGFloat(2.0)
    navigationBar.addSubview(indicator)
  }
}

2. Представление пользовательского контроллера навигации

let someVC = UIViewController()
let customNavigationController = CustomNavigationController()
customNavigationController.setViewControllers([stationsVC], animated: false)
present(playerNavigationController, animated: true) { }

3: Это приведет к следующим результатам Индикатор закрытия модального окна iOS Swift UIKit

Возможно, вам придется изменить некоторую логику здесь, основываясь на иерархии вашего сценария/контроллера представления, но, надеюсь, это даст вам некоторые идеи.

person Shawn Frank    schedule 15.07.2021