Подтвердить что ты не робот

Включить перетаскивание в UIWebView/WKWebView

Trello на веб-сайте рабочего стола позволяет перетаскивать элементы примерно так:

enter image description here

Однако при использовании Safari в iOS это не работает.

Он либо выбирает элемент, либо всплывает лист.

enter image description here

Если я представляю это в UIWebView или WKWebView, могу ли я сделать действие WebView более похожим на рабочий стол Safari, чтобы я мог перетаскивать элементы вокруг?

Я обнаружил, что могу остановить различные действия iOS, отправив webview на javascript:

// stop selection
webView.stringByEvaluatingJavaScriptFromString("document.documentElement.style.webkitUserSelect='none';")

// stop copy/paste etc
webView.stringByEvaluatingJavaScriptFromString("document.documentElement.style.webkitTouchCallout='none';")

// stop loupe
webView.stringByEvaluatingJavaScriptFromString("document.body.style.webkitUserSelect='none';")

Но это все еще не позволяет мне перетаскивать элементы вокруг.

Есть ли решение?

(Я знаю, что есть приложение Trello, мне просто интересно, возможно ли это с помощью WebView)

4b9b3361

Ответ 1

Trello на веб-сайте рабочего стола позволяет перетаскивать элементы вокруг.

Однако при использовании Safari в iOS это не работает.

Причина, по которой он не работает в iOS Safari, заключается в том, что он считает события мыши (на рабочем столе) отличными от событий касания (на iOS)

Если я представляю это в UIWebView или WKWebView, могу ли я сделать действие WebView более похожим на рабочий стол Safari, чтобы я мог перетаскивать элементы вокруг?

.. Мне просто интересно, возможно ли это с помощью WebView

Да, это возможно в WebView. Вы можете использовать JQuery UI для перетаскивания с помощью дополнительной библиотеки, которая переводит события мыши в касание, что вам нужно. Посмотрите jquery-ui-touch-punch. При этом перетаскивание из JQuery UI будет работать на iOS или на любом устройстве. Вы можете использовать что-то вроде:

function touchHandler(event) {
    var touch = event.changedTouches[0];

    var simulatedEvent = document.createEvent("MouseEvent");
        simulatedEvent.initMouseEvent({
        touchstart: "mousedown",
        touchmove: "mousemove",
        touchend: "mouseup"
    }[event.type], true, true, window, 1,
        touch.screenX, touch.screenY,
        touch.clientX, touch.clientY, false,
        false, false, false, 0, null);

    touch.target.dispatchEvent(simulatedEvent);
    event.preventDefault();
}

function init() {
    document.addEventListener("touchstart", touchHandler, true);
    document.addEventListener("touchmove", touchHandler, true);
    document.addEventListener("touchend", touchHandler, true);
    document.addEventListener("touchcancel", touchHandler, true);
}

чтобы преобразовать события мыши в контакт, и это работает как магия. Посмотрите этот учебник по jQuery UI Touch Punch с пользовательским интерфейсом jQuery. Здесь классная статья с демо на том же самом.

вежливость кода

Ответ 2

Ну, это возможно с помощью WebView. Фактический ответ: как? Как, чтобы получить отличный результат UX. Мобильное устройство не является настольным, фактическое решение - это вопрос UX, посвященный мобильному:

Вы можете использовать longtap, чтобы сделать карту "летающей/готовой для перетаскивания" (поворот прокрутки). Или используйте кнопку/плоскую кнопку на карточке, которую пользователи перетаскивают, чтобы перетащить ее. Мысли. Вы должны абсолютно избегать прокрутки и перетаскивания "включено" одновременно. Это перетащить ИЛИ прокрутить, никогда не перетаскивать и прокручивать.

ИЗМЕНИТЬ Вы можете использовать:

Ответ 3

Если вам просто интересно, есть ли простой способ включить drag & drop кросс-платформу даже на мобильных устройствах, я могу предложить вам использовать Interact. js, хорошая библиотека взаимодействия с пользовательским интерфейсом, которую я успешно использовал в нескольких проектах.

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

var position = { x: 0, y: 0 };
interact('.element')
  .draggable({
    onmove: function(e) {
      var target = e.target;

      // calculate position
      position.x += e.dx;
      position.y += e.dy;

      // translate the element
      target.style.webkitTransform = 'translate(' + position.x + 'px, ' + position.y + 'px)';  
    }    
  });

Этот рабочий пример можно найти здесь: http://codepen.io/leonardfactory/pen/MwPBjZ

Я тестировал его на мобильном сафари, и он работает просто отлично, позволяя drag & drop. Вы можете найти дополнительную документацию на странице своего документа.

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

Ответ 4

Я не уверен, что это то, что вам нужно, но посмотрите на это jquery-ui-touch-punch.

Он обрабатывает прикосновения (touchstart, touchmove, touchhend) для правильной работы.

Взгляните на демонстрацию, где вы можете попробовать ее на своем мобильном устройстве демонстрационную страницу touchpunch.