Управление ячейками и средствами управления

Эта статья содержит разные подсказки и примеры для управления ячейками и средствами управления.

Установка размера ячейки или управления

Для установки размера ячейки (и любое управление отдельной ячейки включения) к оптимальному размеру, соответствующему инструкциям по интерфейсу пользователя, сделайте следующее:

  1. Если ячейка содержит текст, установите шрифт текста, чтобы быть соответствующими одному из трех стандартных размеров: регулярный, маленький, и мини-. Сделать это использование метод класса 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];
  2. Установите размер элемента управления в тот же размер, как дали для размера шрифта, с помощью той же константы. Используйте NSControl setControlSize: метод.

    [theCell setControlSize:NSMiniControlSize];
  3. Наконец, отправить 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  Центрируя изображение в его ячейке

- (NSRect) imageRectForBounds:(NSRect)theBounds {
    NSRect r = theBounds;
    // get size. If no image, result of method returning NSSize is undefined so assume NSZeroSize
    NSSize imageSize = [self image] != nil ? [[self image] size] : NSZeroSize;
    r.origin.x = floor((r.size.width/2)  - (imageSize.width/2)  + 0.5);
    r.origin.y = floor((r.size.height/2) - (imageSize.height/2) + 0.5);
    r.size     = imageSize;
    return r;
}

В этом примере ячейка центрирует изображение в ячейке. Обратите внимание на то, что это округляет возвращаемые значения к самому близкому пикселю, чтобы избежать размываться, то получение с частичными смещениями пикселей может вызвать. Код также устанавливает поле размера возвращенного прямоугольника к размеру изображения так, чтобы это было правильно нарисовано в прямоугольнике (принимающий использование объекта NSImage drawInRect:fromRect:operation:fraction: для рисования и нет compositeToPoint:operation:).