Как получить доступ к слою внутри пользовательского класса UIView, созданного с помощью Paintcode?

Я использую Paintcode V3 и последний Xcode для своего проекта.

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

введите здесь описание изображения

В моем проекте Xcode этот пользовательский UIView добавляется в основное представление.

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

Я попытался:

if self.redPathView.frame.intersects(self.anotherView.frame) {       
    //do something...                   
}

но это не может работать, потому что redPathView — это весь холст Paintcode (квадратная рамка), а не только красный путь.

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


person cmii    schedule 05.08.2017    source источник


Ответы (1)


Интересная проблема.

Я не думаю, что есть способ сделать именно то, что вы ищете...
Как вы упомянули, когда мы используем PaintCode, наши пользовательские рисунки становятся целым UIView.
Мы не можем получить доступ к его конкретным элементы (например, ваш redPathView).

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

В любом случае, есть обходной путь. Вы можете использовать сам PaintCode, чтобы сообщить вам, когда происходят «столкновения». Конечно, тогда вам нужно было бы все там нарисовать... И реализовать какой-то внутренний контроль, который имел бы для вас смысл.

Например, на картинке ниже я создал эту «стрелку часов» с функциями для определения, когда красная вещь касается других элементов пользовательского интерфейса (ключевым моментом является выражение touchedElementID — посмотрите, как оно обновляется с помощью «ID» прямоугольников ):

paintCode

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

(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 «затронуты».

Вот окончательный результат:

iOS

Наконец, проверьте этот проект на GitHub со всем кодом и примерами.

person backslash-f    schedule 06.08.2017
comment
ОК, ваше решение может работать для меня, как ожидается, в одном месте вам нужно менять сгенерированный StyleKit каждый раз, когда он экспортируется. Я использую PaintCode все время, и я уверен, что забуду добавить 2 строки... Я собираюсь попробовать другое решение, возможно, без PaintCode. Спасибо - person cmii; 07.08.2017
comment
Да, я тоже часто использую PaintCode. Ваше беспокойство понятно. :-) - person backslash-f; 07.08.2017