Интересная проблема.
Я не думаю, что есть способ сделать именно то, что вы ищете...
Как вы упомянули, когда мы используем PaintCode, наши пользовательские рисунки становятся целым UIView
.
Мы не можем получить доступ к его конкретным элементы (например, ваш redPathView
).
(Я предпочитаю этот вопрос на тот случай, если кто-нибудь знает, действительно ли мы можем это сделать. Я могу ошибаться.)
В любом случае, есть обходной путь. Вы можете использовать сам PaintCode, чтобы сообщить вам, когда происходят «столкновения». Конечно, тогда вам нужно было бы все там нарисовать... И реализовать какой-то внутренний контроль, который имел бы для вас смысл.
Например, на картинке ниже я создал эту «стрелку часов» с функциями для определения, когда красная вещь касается других элементов пользовательского интерфейса (ключевым моментом является выражение touchedElementID
— посмотрите, как оно обновляется с помощью «ID» прямоугольников ):
При таком подходе вы можете столкнуться с некоторыми проблемами, например, необходимостью знать точное положение других элементов на экране и, возможно, сложными тройными конструкциями, такими как:
(rotationSanitized <= -352 || rotationSanitized >= -8) ?
1 :
(rotationSanitized <= -82 && rotationSanitized >= -98) ?
2 :
(rotationSanitized <= -172 && rotationSanitized >= -188) ?
3 :
(rotationSanitized <= -262 && rotationSanitized >= -278) ?
4 : 0
Кроме того, как «экспортировать» и использовать эту информацию вместе с StyleKit в Xcode?
Уловка, которую я сделал, заключалась в том, чтобы добавить пустой (без Fill
, без Stroke
) элемент пользовательского интерфейса в PaintCode и связать результат выражения touchedElementID
со значением alpha
элемента.
Таким образом, я мог получить доступ к выражению в своем пользовательском представлении, например, через StyleKit.touchedElementID
. Но это создает новую проблему, так как теперь мне приходится изменять сгенерированный StyleKit
каждый раз, когда он экспортируется (две строки кода, но все же). Это своего рода хрупкое решение.
Однако, если вы согласны с этим, то это просто вопрос использования этой новой информации...
Для этого я создал протокол, поэтому мой ViewController
может выступать в качестве делегата моего пользовательского представления и выполнять все, что ему нужно. делать, когда большинство внутренних элементов пользовательского интерфейса в PaintCode «затронуты».
Вот окончательный результат:
Наконец, проверьте этот проект на GitHub со всем кодом и примерами.
person
backslash-f
schedule
06.08.2017