У меня возникли некоторые трудности с получением 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
, даже убедившись, что я нахожусь в правильной системе координат. Я подозреваю, что это артефакт рисования, поскольку принуждение к рисованию в другом месте не имеет никакого эффекта.