Используя JQuery для вызова WebMethod

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

Давайте представим, например, что вы хотите показать прямоугольник предполагаемой области при перетаскивании и сделать снимок изображения выбранной части, когда вы закончите перетаскивание. Затем вы могли бы сделать что-то вроде:

@IBOutlet weak var imageView: UIImageView!

var startPoint: CGPoint?

let rectShapeLayer: CAShapeLayer = {
    let shapeLayer = CAShapeLayer()
    shapeLayer.strokeColor = UIColor.black.cgColor
    shapeLayer.fillColor = UIColor.clear.cgColor
    shapeLayer.lineWidth = 3
    return shapeLayer
}()

override func touchesBegan(_ touches: Set, with event: UIEvent?) {
    startPoint = nil

    guard let touch = touches.first else { return }

    startPoint = touch.location(in: imageView)

    // you might want to initialize whatever you need to begin showing selected rectangle below, e.g.

    rectShapeLayer.path = nil

    imageView.layer.addSublayer(rectShapeLayer)
}

override func touchesMoved(_ touches: Set, with event: UIEvent?) {
    guard let touch = touches.first, let startPoint = startPoint else { return }

    let currentPoint: CGPoint

    if let predicted = event?.predictedTouches(for: touch), let lastPoint = predicted.last {
        currentPoint = lastPoint.location(in: imageView)
    } else {
        currentPoint = touch.location(in: imageView)
    }

    let frame = rect(from: startPoint, to: currentPoint)

    // you might do something with `frame`, e.g. show bounding box

    rectShapeLayer.path = UIBezierPath(rect: frame).cgPath
}

override func touchesEnded(_ touches: Set, with event: UIEvent?) {
    guard let touch = touches.first, let startPoint = startPoint else { return }

    let currentPoint = touch.location(in: imageView)
    let frame = rect(from: startPoint, to: currentPoint)

    // you might do something with `frame`, e.g. remove bounding box but take snapshot of selected `CGRect`

    rectShapeLayer.removeFromSuperlayer()
    let image = imageView.snapshot(rect: frame, afterScreenUpdates: true)

    // do something with this `image`
}

private func rect(from: CGPoint, to: CGPoint) -> CGRect {
    return CGRect(x: min(from.x, to.x),
           y: min(from.y, to.y),
           width: abs(to.x - from.x),
           height: abs(to.y - from.y))
}

Где у вас есть это UIView расширение для создания снимка: Снимок изображения, то, хорошо, делайте что хотите. Но это иллюстрирует основную идею.


Пара небольших вещей в моем примере выше:

  • Обратите внимание, что я ограничиваю свои ивары теми вещами, которые мне абсолютно необходимы. Например. текущий touch, вероятно, должен быть локальной переменной, а не иваром. Мы всегда должны ограничивать наши переменные максимально узким диапазоном, чтобы избежать непредвиденных последствий и т. Д.

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

  • Я совсем не уверен, почему вы позвонили setNeedsDisplay. Это кажется ненужным, если не было чего-то еще, что вы намеревались там.

  • Я не уверен, какой режим контента вы использовали для просмотра изображений. Например, если вы использовали «Подгонка масштаба» и хотели сделать снимок этого, вы можете выбрать другой алгоритм моментального снимка, например, как описано в https://stackoverflow.com/a/54191120/1271826 . [тысяча сто двадцать одна]

11
задан John Saunders 3 August 2009 в 17:26
поделиться

2 ответа

Для решения проблемы как это первое, что нужно сделать является часами это в Firebug.

Если Вы будете нажимать на ссылку "Search" и будете наблюдать запрос/ответ POST в консоли Firebug, то Вы будете видеть, что это бросает 500 ошибок сервера: Недопустимый Примитив JSON.

Причина этого состоит в том, потому что идентификаторы ключа/значения в Ваших "данных" литерал JSON не заключаются в кавычки. Строка 17 должна быть:

data: "{'text':'" + search + "'}",

Затем все будут работать как ожидалось.

Примечание: Предложенные данные {тест: поиск} не будет работать. Если Вы предоставите jQuery фактический литерал JSON вместо строки, то он преобразует это в пару ключ/значение test=search и POST это вместо JSON. Это также заставит ASP.NET AJAX ScriptService или PageMethod бросать Недопустимую Примитивную ошибку JSON.

15
ответ дан 3 December 2019 в 05:36
поделиться

Необходимо сделать следующий (C#):

  • WebMethod должен быть public static
  • Это должно быть украшено [WebMethod] атрибут
  • Вам нужен ScriptManager на Вашей .aspx странице
  • Установите ScriptManager EnablePageMethods="true"

И вот некоторый демонстрационный JavaScript:

$().ready(function() {
    $(yourDropDownList).change(LoadValues);
});


function LoadValues() {
    PageMethods.YourMethod(arg1, CallSuccess, CallFailed);
}

function CallFailed(result) {
    alert('AJAX Error:' + result.get_message());
}

function CallSuccess(result) {
    //do whatever you need with the result
}
6
ответ дан 3 December 2019 в 05:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: