Технические вопросы и ответы QA1785

Фокусирующие кольца и поддержанные уровнем представления

Q: Почему фокусирующее кольцо моего пользовательского поддержанного уровнем представления нарисовано неправильно? Как я могу фиксировать это?

A: Перед OS X 10.7, Вы нарисовали бы фокусирующее кольцо своего представления путем реализации NSView's -drawRect: метод и использующий, например, NSSetFocusRingStyle/NSRectFill. Когда представление рисует фокусирующее кольцо, оно рисует его как часть его drawRect метода. Когда получение предназначается на уровень, однако, фокусирующее кольцо не может расшириться за пределами того уровня. Этим результатом является тонкое, неправильное фокусирующее кольцо в поддержанном уровнем режиме.

Начиная с OS X 10.7 можно использовать AppKit APIs для рисования фокусирующего кольца для автоматического обеспечения непротиворечивого стирания фокусирующего кольца и перерисовки. Фокусирующие кольца нарисованы отдельные от его получения представления. Таким образом, теперь намного проще нарисовать фокусирующие кольца с помощью следующего:

Перечисление 1  10,7 APIs для поддержки фокусирующих колец

- (void)drawFocusRingMask NS_AVAILABLE_MAC(10_7);
- (NSRect)focusRingMaskBounds NS_AVAILABLE_MAC(10_7);
- (void)noteFocusRingMaskChanged NS_AVAILABLE_MAC(10_7);

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

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

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

Для выбора - в новые 10,7 моделей рисования фокусирующего кольца представление просто переопределяет -drawFocusRingMask метод для рисования формы, схема которой должна служить шаблоном для фокусирующего кольца, и -focusRingMaskBounds возвратить ограничительную рамку той формы (выраженный во внутренней части представления («границы») координатное пространство). Например, простое прямоугольное фокусирующее кольцо, окружающее кадр представления, требовали бы путем простого выполнения:

  Пример кода перечисления 2 для определения фокусирующего кольца

- (void)drawFocusRingMask {
    NSRectFill([self bounds]);
}
 
- (NSRect)focusRingMaskBounds {
    return [self bounds];
}

Для получения дополнительной информации о рисовании фокусирующих колец вокруг Ваших представлений обратитесь к Примечаниям Выпуска Developer OS X для 10,7



История версии документа


ДатаПримечания
12.11.2013

Новый документ, объясняющий, как нарисовать фокусирующие кольца вокруг пользовательского NSViews.