Хобрук: Ваш путь к мастерству в программировании

Не удается панорамировать меньший UIView за пределами его супервизора

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

Тем не менее, я могу перетаскивать эти меньшие представления только внутри большего UIView, в котором они содержатся. Когда пользователь впервые пытается панорамировать меньший вид, есть ли способ программно создать второй UIView сверху, а затем вместо этого перетащить второй UIView ? Второй UIView будет совершенно новым по сравнению с меньшим представлением, которое было затронуто первым.

Это функция обработчика, которая у меня есть до сих пор, просто для справки. Однако я не знаю, где программно создать второй UIView. Любая помощь будет принята с благодарностью:

 @objc func handlePanGesture(sender: UIPanGestureRecognizer) {
    // get translation
    var translation = sender.translation(in: view)
    sender.setTranslation(CGPoint.zero, in: view)

    // drag around current UIView
    var newView = sender.view as! UIView
    newView.center = CGPoint(x: newView.center.x+translation.x, y: newView.center.y+translation.y)
    newView.isMultipleTouchEnabled = true
    newView.isUserInteractionEnabled = true

    if sender.state == UIGestureRecognizer.State.began {
        // add something you want to happen when the Label Panning has started
    }

    if sender.state == UIGestureRecognizer.State.ended {
        // add something you want to happen when the Label Panning has ended
    }

    if sender.state == UIGestureRecognizer.State.changed {
        // add something you want to happen when the Label Panning has been change ( during the moving/panning )
    } else {
        // or something when it's not moving
    }
}

Что я пытаюсь сделать в своем приложении


  • Изображение или видео могут помочь другим понять, что вы пытаетесь сделать. Если вы хотите переместить представление за пределы его родительского представления, вам придется либо отключить clpsToBounds, либо переместить представление в другое родительское представление. 22.09.2019
  • @shim Добавлено изображение, объясняющее проблему. Как мне программно изменить родительский вид UIView? 22.09.2019
  • удалитьFromSuperview, добавитьSubview 22.09.2019
  • @shim, когда пользователь впервые пытается панорамировать меньший вид, есть ли способ программно создать второй UIView, а затем вместо этого перетащить второй UIView? Второй UIView будет совершенно новым по сравнению с исходным меньшим представлением, которое было впервые затронуто... 22.09.2019
  • Вы можете сделать вид, который выглядит одинаково, поместить его в то же начальное место и скрыть исходный вид. 22.09.2019
  • И как мне убедиться, что переводы применяются ко второму созданному UIView, а не к исходному распознавателю жестов? 22.09.2019

Ответы:


1

Есть ли способ перетаскивать меньшие представления куда угодно, сохраняя тот же макет, который у меня есть прямо сейчас?

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

22.09.2019
  • Есть ли способ программно создать второй UIView поверх всего, а затем вместо этого перетащить второй UIView? Второй UIView будет полностью отделен от исходного меньшего представления, которое было затронуто первым. 22.09.2019

  • 2

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

    https://developer.apple.com/documentation/uikit/drag_and_drop/adopting_drag_and_drop_in_a_custom_view

    Посмотрите на строку 36 в ViewController+Drag.swift для соответствующего кода.

    22.09.2019
  • Можно ли создать этот клон исходного вида с помощью UIPanGesture? Для этого проекта я должен работать с более низкой целью развертывания iOS, в которой еще нет UIDragInteraction. 22.09.2019
  • Да, это вообще не зависит от DragAndDrop API 22.09.2019
  • Мне нужно развернуть на iOS 10.0, но когда я загрузил пример проекта по этой ссылке, я получил сообщение об ошибке «UIDragInteraction» доступно только на iOS 11.0 или новее. Где в обработчике жестов панорамирования я могу сделать копию представления, которое я пытаюсь перетащить? 22.09.2019
  • На жесте началось, потом в изменённом надо ещё и перевод обновить, надо будет обновить рамку на клонированном виде. 22.09.2019
  • Как бы я изменил var translation = sender.translation(in: view) на программно созданный перевод представления? В принципе, как мне сохранить исходное представление именно там, где оно есть, а затем вместо этого применить все переводы к вновь созданному представлению? Мне нужны 2 функции обработчика? 22.09.2019
  • Мне удалось успешно добавить второй UIView в .begin, но в .changed я не знаю, как изменить центр нового представления, если для перевода установлено исходное представление. 22.09.2019
  • Вам нужно будет преобразовать перевод, чтобы он был указан с точки зрения нового представления и его суперпредставления. Взгляните на функции преобразования UIView. Также хорошо подумать головой, что вы будете делать в конце перетаскивания? Будет ли этот жест частью перехода к другому виду? 23.09.2019
  • Давайте продолжим обсуждение в чате. 23.09.2019
  • Новые материалы

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

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

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..

    React Hooks: основы деструктуризации массива
    Kent C. Dodds написал классный пост о том, как грядущая функция React под названием Hooks работает на капоте. Предстоящий хук React useState основан на деструктурировании массива, давайте..

    Пакеты R, используемые в Tesla
    Добро пожаловать обратно! R — очень популярный язык программирования, используемый множеством компаний, включая Tesla! Итак, давайте взглянем на некоторые пакеты R, которые использует Tesla...

    Сокращение и слияние токенов для эффективных моделей VL: обзор
    Часто в задачах, связанных с компьютерным зрением и НЛП, вычислительно затратная и требующая большого объема памяти обработка становится препятствием для более быстрого логического вывода модели, а..