NSTextField с «отступом» справа - PullRequest
5 голосов
/ 22 марта 2009

Я пытаюсь, чтобы «Уведомление об оставшихся символах» отображалось в моем округленном NSTextField, и я получил его с помощью двух NSTextFields с помощью Interface Builder, и оно уже выглядит так:

альтернативный текст http://jeenaparadies.net/t/s/Twittia-NSTextField1.png

Но когда я пишу немного больше, это выглядит так:

альтернативный текст http://jeenaparadies.net/t/s/Twittia-NSTextField2.png

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

1 Ответ

11 голосов
/ 22 марта 2009

Самый простой способ - это создать подкласс NSTextFieldCell и переопределить -drawInteriorWithFrame:inView: и -selectWithFrame:inView:editor:delegate:start:length:.

Вам нужно будет решить, сколько места выделить для вашего счета и нарисовать сокращенное пространство. Что-то вроде этого примера кода должно работать, хотя это не было проверено в закругленном текстовом поле.

Дополнительную информацию о подклассах NSCell можно найти в примере кода PhotoSearch от Apple .

- (void)drawInteriorWithFrame:(NSRect)bounds inView:(NSView *)controlView {
    NSRect titleRect = [self titleRectForBounds:bounds];
    NSRect countRect = [self countAreaRectForBounds:bounds];

    titleRect = NSInsetRect(titleRect, 2, 0);

    NSAttributedString *title = [self attributedStringValue];
    NSAttributedString *count = [self countAttributedString];

    if (title)
        [title drawInRect:titleRect];

    [count drawInRect:countRect];
}

- (void)selectWithFrame:(NSRect)aRect inView:(NSView *)controlView editor:(NSText *)textObj delegate:(id)anObject start:(NSInteger)selStart length:(NSInteger)selLength {
    NSRect selectFrame = aRect;
    NSRect countRect = [self countAreaRectForBounds:aRect];

    selectFrame.size.width -= countRect.size.width + PADDING_AROUND_COUNT;

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(__textChanged:) name:NSTextDidChangeNotification object:textObj];
    [super selectWithFrame:selectFrame inView:controlView editor:textObj delegate:anObject start:selStart length:selLength];
}

- (void)endEditing:(NSText *)editor {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSTextDidChangeNotification object:editor];

    [super endEditing:editor];
}

- (void)__textChanged:(NSNotification *)notif {
    [[self controlView] setNeedsDisplay:YES];
}
...