Убедитесь, что NSTrackingArea обновлен во вложенных NSScrollViews.

У меня есть NSCollectionView в NSScrollView. Представление прокрутки прокручивается горизонтально для перемещения по строке элементов. Внутри каждого элемента коллекции находится NSOutlineView с вертикальной прокруткой.

У меня есть объекты NSButton для открытия и закрытия элементов коллекции — в качестве дополнительных представлений в моей коллекции. Я настроил NSTrackingAreas на эти кнопки для поддержки эффектов наведения мыши.

Это работает правильно, пока я не прокручиваю, и в этот момент области NSTrackingArea явно остаются позади (эффекты наведения мыши происходят, когда мышь находится там, где была кнопка, а не там, где она).

Я перестраиваю свои области отслеживания в updateTrackingAreas в моем классе кнопок, и это вызывается, но недостаточно часто.

Я пытался использовать .inVisibleRect при настройке областей отслеживания, а не явно перестраивать их, но это не улучшает обновление отслеживания.

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

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

Такое ощущение, что updateTrackingArea по умолчанию переоптимизирован и вызывается не так часто, как следовало бы.

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

... но, может быть, кто-то увидит что-то очевидное, чего мне не хватает? Спасибо.


person Giles    schedule 12.12.2018    source источник
comment
Еще немного тестирования - всплывающие подсказки на ссылках NSTextView имеют то же смещение, что и область отслеживания кнопок после прокрутки.   -  person Giles    schedule 12.12.2018
comment
Хорошо, похоже, это даже хуже, чем я думал, потому что уверенность в том, что область отслеживания воссоздается при прокрутке, все еще не решает проблему. Границы представления, похоже, не переводятся должным образом с использованием родительских представлений.   -  person Giles    schedule 17.12.2018
comment
Похоже, что похожая проблема была обнаружена здесь: cocoa-dev. apple.narkive.com/aL6UaipM/   -  person Giles    schedule 17.12.2018
comment
Мой тестовый проект работает нормально. Как мы можем воспроизвести проблему?   -  person Willeke    schedule 17.12.2018
comment
Большое спасибо за тестирование Виллеке. Интересно, что на твоем все работает. Какой макет вы используете? У меня есть подкласс NSCollectionViewFlowLayout. Я могу попытаться разбить свой проект, чтобы найти проблему. Интересно, что у меня есть NSOutlineViews в моих элементах коллекции. Если я выполняю вертикальную прокрутку на них, все позиции области отслеживания сбрасываются правильно. Может быть, моя фильтрация колеса прокрутки что-то где-то ломает...   -  person Giles    schedule 17.12.2018
comment
@Willeke - я почти уверен, что наивно имел дело с событиями scrollWheel, чтобы иметь дело с контентом с вертикальной прокруткой внутри более крупного представления коллекции с горизонтальной прокруткой. Это первый раз, когда я вижу ошибку, которая может быть связана с моей реализацией. Возможно, я поглощал информацию, которую нужно было передать в представление верхнего уровня, или дублировал ее, или что-то подобное. Пожалуйста, пока не проводите дальнейших расследований. Большое вам спасибо за ваше время.   -  person Giles    schedule 17.12.2018
comment
... отправил проблему в Apple - пытаясь найти правильный способ вложения прокрутки...   -  person Giles    schedule 18.12.2018
comment
Спасибо за вашу помощь @Willeke - проблема была тонкой, вызванной вложением прокрутки. stackoverflow.com/questions/8623785/   -  person Giles    schedule 19.12.2018


Ответы (1)


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

NSScrollView внутри другого NSScrollView

person Giles    schedule 19.12.2018