Управление ячейками и средствами управления
Эта статья содержит разные подсказки и примеры для управления ячейками и средствами управления.
Установка размера ячейки или управления
Для установки размера ячейки (и любое управление отдельной ячейки включения) к оптимальному размеру, соответствующему инструкциям по интерфейсу пользователя, сделайте следующее:
Если ячейка содержит текст, установите шрифт текста, чтобы быть соответствующими одному из трех стандартных размеров: регулярный, маленький, и мини-. Сделать это использование метод класса NSFont
systemFontSizeForControlSize:
. Параметр этому методуNSControlSize
постоянный объявленный классом NSControl.float fontSize = [NSFont systemFontSizeForControlSize:NSMiniControlSize];
NSCell *theCell = [theControl cell];
NSFont *theFont = [NSFont fontWithName:[[theCell font] fontName] size:fontSize];
[theCell setFont:theFont];
Установите размер элемента управления в тот же размер, как дали для размера шрифта, с помощью той же константы. Используйте NSControl
setControlSize:
метод.[theCell setControlSize:NSMiniControlSize];
Наконец, отправить
sizeToFit
к управлению для обрезки дополнительной ширины.[theControl sizeToFit];
Рисование фокусирующего кольца в границах ячейки
NSSetFocusRingStyle
устанавливает стиль, что фокусирующее кольцо будет нарисовано в следующий раз, когда Вы заполняете путь bezier. Это берет константу типа NSFocusRingPlacement
сказать Набору Приложения рисовать фокусирующее кольцо по изображению, в соответствии с текстом, или (когда никакой текст или изображение не являются рассмотрением) вокруг формы. Можно использовать эту функцию с константой NSFocusRingOnly
нарисовать фокусирующее кольцо только в границах ячейки.
Перечисление 1 показывает, как Вы рисуете такое фокусирующее кольцо. Это требует, чтобы Вы переопределили NSCell drawWithFrame:inView:
. В этом методе, если ячейка, как предполагается, рисует доказательство состояния первого респондента, устанавливают прямоугольник для фокусирующего кольца, вызывают NSSetFocusRingStyle
с параметром NSFocusRingOnly
, и затем создайте и заполните путь bezier, определяющий тот прямоугольник. Заполнение в этом случае просто рисует кольцо.
Перечисление 1 , Получающее фокусирующее кольцо только в границах ячейки
- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView { |
// other stuff might happen here |
if ([self showsFirstResponder]) { |
// showsFirstResponder is set for us by the NSControl that is drawing us. |
NSRect focusRingFrame = cellFrame; |
focusRingFrame.size.height -= 2.0; |
[NSGraphicsContext saveGraphicsState]; |
NSSetFocusRingStyle(NSFocusRingOnly); |
[[NSBezierPath bezierPathWithRect: NSInsetRect(focusRingFrame,4,4)] fill]; |
[NSGraphicsContext restoreGraphicsState]; |
} |
// other stuff might happen here |
} |
Расположение изображения в ячейке
Если ячейка должна вывести на экран изображение вместо (или в дополнение к) текст, можно влиять на размещение изображения в ячейке путем переопределения imageRectForBounds:
метод, объявляющийся и NSCell и классами NSMenuItemCell. Этот метод возвращает прямоугольник, в котором нарисовано изображение ячейки, который обычно является прямоугольником, немного смещенным от границ ячейки. Перечисление 2 дает пример.
Перечисление 2 Центрируя изображение в его ячейке
В этом примере ячейка центрирует изображение в ячейке. Обратите внимание на то, что это округляет возвращаемые значения к самому близкому пикселю, чтобы избежать размываться, то получение с частичными смещениями пикселей может вызвать. Код также устанавливает поле размера возвращенного прямоугольника к размеру изображения так, чтобы это было правильно нарисовано в прямоугольнике (принимающий использование объекта NSImage drawInRect:fromRect:operation:fraction:
для рисования и нет compositeToPoint:operation:
).