Наложение NSTextView вызывает странности со статусом первого респондента - PullRequest
1 голос
/ 28 октября 2010

У меня есть NSTextView в NSScrollView, и я программно вставляю подкласс NSView в качестве подпредставления NSTextView. Это NSView действует как наложение, накладывая графическую информацию о тексте под ним.

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

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

Если я смещу рамку вложенного подпредставления, текстовое представление будет вести себя на 100% нормально в области, не перекрываемой наложением, но перекрывающаяся область ведет себя неправильно, как указано выше.

Действия по репликации этого поведения в Mac OS X 10.6.4:

  1. Создание простого старого бездокументного приложения Какао.
  2. Добавить IBOutlet NSTextView к делегату приложения .h.
  3. Добавьте NSTextView к окну в MainMenu.xib. Подключите выход textView.
  4. Введите немного кода:

В applicationDidFinishLaunching:

NSView *overlay = [[NSView alloc] initWithFrame:textView.bounds];
[textView addSubview:overlay];
[overlay release];

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

Затем добавьте NSOutlineView в окно в xib. Обратите внимание, что после того, как фокус покинет текстовую область (если вы щелкнете на виде структуры) с наложением, вы не сможете снова установить фокус на текстовый вид (он больше не станет первым респондентом).


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

Ответы [ 3 ]

1 голос
/ 30 октября 2010

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

0 голосов
/ 14 марта 2012

Простой способ справиться с этим - сделать свой оверлейный вид настраиваемым подклассом NSView, а затем переопределить метод hitTest: , чтобы всегда возвращать nil . Это предотвратит участие наложения в цепочке респондента. Вместо этого события будут автоматически отправляться в его суперпредставление или представления выше иерархии представления. Вы также можете переопределить acceptsFirstResponder , чтобы вернуть NO , чтобы быть безопасным (в случае, если он случайно установлен программно).

0 голосов
/ 29 октября 2010

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

...