Как исправить обрезку подсветки кольца фокусировки при использовании CALayer? - PullRequest
5 голосов
/ 06 марта 2011

Окно contentView имеет NSTextFields.(MacOS)

Я использую конструктор интерфейса для настройки окна и его функций, поэтому в awakeFromNib нет ничего, кроме этого:

[[self.window contentView] setWantsLayer:YES];
CALayer *layer = [[self.window contentView] layer];
CGColorRef lightGray = CGColorCreateGenericGray(0.93, 1.0);
[layer setBackgroundColor:lightGray];
CGColorRelease(lightGray);

Однако кольцо фокусировки textField не видно за пределамиграницы textField.

со слоем:Хостинг imgur.com

Без слоя:Хостинг imgur.com

Я думаю, что эта проблема с дисплеем является чем-то большим, чем эта, но я не могу найти пример этой проблемы (и решения).

Кто-нибудь?

1 Ответ

5 голосов
/ 15 марта 2011

Это давно известная проблема - в списке рассылки Cocoa-dev еще в 2008 году упоминалось упоминание . На самом деле кольцо фокуса рисуется за пределами рамки его представления.Рисование NSView разрешено, но не работает с CALayers.Несмотря на обнадеживающую заметку в заметках о выпуске Leopard AppKit , называемых Представления, кольца фокусировки и производительность рисования , это не изменилось.вокруг с текстовыми полями рамок слоев и добавьте некоторые отступы, чтобы кольцо фокусировки показывалось полностью.Тем не менее, я только что попробовал это, и кажется, что, по крайней мере, для NSTextField, он не будет аккуратно рисовать внутри измененного фрейма.Попробуйте, однако, - я не суетился с этим слишком долго.(Кольцо фокусировки проходит на 4 пикселя от рамки в каждом направлении.)

Как примечание, вы технически нарушаете правила на основе слоев, что может быть причиной того, что у вас возникают трудности.От NSView setWantsLayer: документы :

При использовании представлений со слоем никогда не следует напрямую взаимодействовать со слоем.

Вы используете вид со слоем и меняете его фон.Вы можете обойти это, создав собственный слой, но:

При использовании вида размещения слоев вы не должны полагаться на представление для рисования и не должны добавлять подпредставления к слою.-хостинг-представление.

, исключающее размещение текстовых полей в представлении.

(При необходимости обратитесь к этому вопросу SO: Разница между Layer-Backed иLayer-Hosting Views? )

...