Рисование линий между окнами, как в Интерфейсном Разработчике - PullRequest
3 голосов
/ 13 июня 2010

У меня есть два окна, каждое с круглым NSView:

------------------     ------------
|X-+ Oscillator  |     |X-+ Mixer |
|----------------|     |----------|
|                |     |          |
|        O       |     |     O    |
|                |     |          |
|                |     |          |
------------------     ------------

Оба окна находятся в отдельном NIB.Я хочу, чтобы можно было нарисовать линию между двумя раундами NSView s во время выполнения, используя drag'n'drop, точно так же, как подключение IBOutlets в Interface Builder:

------------------     ------------
|X-+ Oscillator  |     |X-+ Mixer |
|----------------|     |----------|
|                |     |          |
|        O-------+-----+-----O    |
|                |     |          |
|                |     |          |
------------------     ------------

Я также хочу иметь возможностьопределить, к какому NSView s подключены NSView s, используя нарисованные линии.Мне это нужно для подключения осцилляторов к микшерам.Я также хочу иметь возможность удалять соединения, перетаскивая в пустое пространство.

Может кто-нибудь объяснить мне, как это сделать?Спасибо.

Ответы [ 2 ]

2 голосов
/ 13 июня 2010

Проблема в том, что вы можете нарисовать вид, который охватывает объединенные участки двух окон (или экран или экраны, на которых они находятся). Обычно это делается с помощью прозрачного «окна наложения» без полей. Есть много примеров прозрачного окна без полей, доступного в Интернете.

В начале перетаскивания появляется окно наложения (но оно невидимо для пользователя), расположенное над областью рисования. Когда перетаскивание обновляется, вы рисуете свою линию, переводя координаты наложенного вида в / из координат исходного / целевого вида. Когда перетаскивание завершено, создайте анимацию (например, исчезновение или мигание), а затем закажите окно наложения.

0 голосов
/ 13 июня 2010

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

Как сказал Джошуа, один из подходов заключается в использовании невидимого оверлейного окна, которое просто показывает ссылку.Но если вы действительно используете два отдельных окна, то вы не можете (как предлагает Джошуа) упорядочить оверлейное окно в конце перетаскивания.Если вы сделаете это, ссылка исчезнет в конце перетаскивания.Если вы хотите, чтобы ссылка продолжала отображаться (подумайте о Интерфейсном Разработчике или - еще лучше - Кварцевом Композиторе), тогда вам нужен какой-то механизм для постоянного отображения ссылки.Это особенно верно, если вы хотите позже разрешить пользователю удалить ссылку.

Я бы настоятельно рекомендовал построить ваш интерфейс вокруг одного окна.Также рассмотрите возможность использования Core Animation для отображения каждой ссылки в виде слоя.

Дейв

...