iPhone обнаруживает прикосновения на карте

StackOverflow https://stackoverflow.com/questions/1219465

  •  10-07-2019
  •  | 
  •  

Вопрос

У меня есть статичное изображение карты с кучей кругов и квадратов, на которых изображены города. Я загрузил изображение в imageView, которое подклассифицировано под scrollView, чтобы я мог захватывать касания пользователя и масштабировать / прокручивать по карте. Моя проблема заключается в том, что я хочу, чтобы пользователь нажимал на ярлык всякий раз, когда пользователь касается одного из этих кругов / квадратов для города, чтобы сообщить ему, какой это город, и, возможно, загрузить подробный вид города. Я подумал, что могу предварительно загрузить все относительные CGPoints для городов, основанных на карте imageView, в словарь, чтобы я мог ссылаться на них во время & Quot; touchesBegan & Quot; событие, но я быстро перебираюсь через голову и, возможно, поступаю неправильно.

Пока все работает, и я могу зафиксировать координаты касаний x и y CGPoint. Самая большая проблема, которую я имею, - это определение близости прикосновений пользователя к отдельной точке, которую я могу иметь в словаре. Другими словами, если в словаре есть & Quot; Boston = NSPoint: {235, 118}; & Quot; как я могу определить, когда пользователь находится близко к этой точке, не заставляя его повторять касание, пока оно не станет точным? Есть ли простой способ определить, является ли касание пользователя & Quot; закрыть & Quot; до существующей точки? Я иду об этом правильным путем?

Любые советы или шлепки по затылку приветствуются.

Спасибо, Майк

Это было полезно?

Решение

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

Другие советы

если я правильно понимаю, вы хотите знать, является ли точка, в которой нажал пользователь, " закрыть " достаточно до точки, которая помечена как город.

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

как только вы это сделаете, вычислите декартову координату расстояния sqrt ((x1-x2) ^ 2 + (y1-y2) ^ 2) для каждого элемента (прочитайте словарь со значениями x, y для городов) в массиве и сохраните результаты в другом массиве. затем возьмите минимум результата. индекс этого результата - город, ближайший к крану, если он меньше указанного порога.

вы можете использовать R-Tree или рассчитать близость прикосновения к каждой видимой точке в текущем представлении. Для вычисления близости вы обычно используете теорему Пифагора, но в этом случае вы можете пропустить квадратный корень, потому что вы сравниваете только относительные размеры. Также вы можете объявить обрезанное расстояние, если хотите, скажем, 50 пикселей в квадрате к 2500. Таким образом, вы поместите результат в объект, содержащий расстояние и опорную точку, и поместите объекты в NSMutableArray, не добавляя результаты под вашей обрезкой, и выберите минимальный результат.

Так что если у вас есть точка касания pT, то для каждой точки pN вы должны рассчитать:

d=(pT.x-pN.x)*(pT.x-pN.x) + (pT.y-pN.y)*(pT.y-pN.y); //d is the squared distance

Точка d с минимальным значением d <= 10*10 - это точка, ближайшая к <=>. И, как я уже сказал, если вы хотите, чтобы учитывались только касания в пределах 10 пикселей, вы можете проверить это <=>;

Метод проверки касаний в пределах площади 20x20 также работает, за исключением случаев, когда две точки находятся в пределах 20 пикселей друг от друга, поэтому вам нужно знать, какая точка касания находится ближе всего.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top