Как получить закругленные углы на NSScrollView для работы с NSRulerView - PullRequest
3 голосов
/ 30 марта 2012

У меня возникли некоторые трудности с получением NSTextView, встроенного в NSScrollView с горизонтальной NSRulerView, чтобы хорошо играть с закругленной угловой маской. Я создал простое тестовое приложение для локализации проблемы.

Во-первых, кажется, что есть два основных способа получения закругленных углов на NSScrollView. Первый - использовать CAShapeLayer и установить для его свойства path желаемый путь Безье с закругленными прямоугольниками. Второй - установить для свойства CALayer s cornerRadius желаемое значение, а затем для свойства backgroundColor установить любой цвет с альфа-каналом 1,0 (например, сплошной черный). Затем любой из этих слоев можно использовать для установки свойства mask фонового слоя NSScrollView после создания слоя с помощью setWantsLayer:. Хотя я получаю некоторые артефакты рисования, когда применяю их непосредственно к фоновому слою NSScrollView. Поэтому вместо этого я применяю маску к слою подложки суперпредставления NSScrollView. Само супервидение - это просто контейнерное представление.

Теперь проблема возникает, когда мы показываем представление линейки и начинаем с ним взаимодействовать. Сама линейка выглядит великолепно, имеет закругленные углы из-за маски, примененной выше. Однако, когда я начинаю добавлять и перетаскивать маркеры, они остаются невидимыми до тех пор, пока я не отпущу мышь, что затрудняет позиционирование маркеров. Кроме того, стандартные вертикальные линии маркера не отображаются при перетаскивании.

Я подтвердил, что это происходит из-за присутствия маски. Когда я отключаю маску, NSRulerView ведет себя нормально.

Итак, вопрос в том, как я могу получить округленные углы NSRulerView и NSScrollView, чтобы хорошо играть вместе?

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

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

...