Изменение размера представления на становиться становящимся ответчиком и resignFirstResponder - Какао (OS X) - PullRequest
2 голосов
/ 02 января 2012

У меня есть поле поиска, исходная ширина которого мала (потому что так оно выглядит лучше).Однако, когда пользователь нажимает на поле поиска, я хочу увеличить его ширину на определенную величину.Когда пользователь нажимает снаружи, я хочу изменить его размер до исходного размера.Я также хочу сделать все изменения размеров с анимацией.

Вот что у меня есть:

#define kAddedWidth 85

@implementation ToolbarSearchField

- (id)initWithFrame: (NSRect)frameRect
{
    self = [super initWithFrame: frameRect];
    if (self) {
        originalSize = self.frame.size.width;
    }

    return self;
}
- (void)awakeFromNib
{
    [super awakeFromNib];
    originalSize = self.frame.size.width;
}

- (BOOL)becomeFirstResponder
{    
    NSRect newFrame = NSMakeRect(self.frame.origin.x, self.frame.origin.y, originalSize + kAddedWidth, self.frame.size.height);    
    [[self animator] setFrame: newFrame];

    return [super becomeFirstResponder];
}

- (BOOL)resignFirstResponder
{    
    NSRect newFrame = NSMakeRect(self.frame.origin.x, self.frame.origin.y, originalSize, self.frame.size.height);
    [[self animator] setFrame: newFrame];

    return [super resignFirstResponder];
}

@end

originalSize - это iVar.

Проблема в том, что этоничего не меняетЩелчок по полю или за его пределами не делает ни одного бита.

Я сделал некоторую отладку NSLog, и кажется, что когда я щелкаю по полю, вызывается becomeFirstResponder и сразу после этого вызывается resignFirstResponder,аннулирование анимации изменения размера.Тем не менее, поле все еще активно и мигает точка вставки.Есть идеи?

Решение:

Благодаря ответу Питера Хоси мне удалось решить эту проблему.Вот мое решение:

#define kAddedWidth (self.superview.bounds.size.width - self.frame.origin.x * 2 - originalSize)

@implementation ToolbarSearchField

- (id)initWithFrame: (NSRect)frameRect
{
    self = [super initWithFrame: frameRect];
    if (self) {
        originalSize = self.frame.size.width;
    }

    return self;
}
- (void)awakeFromNib
{
    [super awakeFromNib];
    originalSize = self.frame.size.width;
}

- (void)textDidBeginEditing: (NSNotification*)notification
{    
    [super textDidBeginEditing: notification];
    isEditing = YES;

    NSRect newFrame = NSMakeRect(self.frame.origin.x, self.frame.origin.y, originalSize + kAddedWidth, self.frame.size.height);
    [[self animator] setFrame: newFrame];
}
- (void)textDidEndEditing: (NSNotification*)notification
{    
    [super textDidEndEditing: notification];
    isEditing = NO;

    if ([self.stringValue isEqualToString: @""]) {
        NSRect newFrame = NSMakeRect(self.frame.origin.x, self.frame.origin.y, originalSize, self.frame.size.height);
        [[self animator] setFrame: newFrame]; 
    }
}

- (void)mouseDown: (NSEvent*)theEvent
{
    if (!isEditing) {
        NSRect newFrame = NSMakeRect(self.frame.origin.x, self.frame.origin.y, originalSize + kAddedWidth, self.frame.size.height);
        [[self animator] setFrame: newFrame];
    }

    [super mouseDown: theEvent];
}

Когда поле щелкается и оно не редактируется, анимируйте его в большем размере.Всякий раз, когда поле заканчивается редактированием, анимируйте, только если в нем нет текста.Если в нем есть текст, лучше не уменьшать поле.

1 Ответ

3 голосов
/ 02 января 2012

Поля не обрабатывают ввод текста. Эта ответственность лежит на редакторе полей, который является экземпляром NSText (или некоторого его подкласса), принадлежащим окну.

Вместо этого можно попробовать реализовать метод textDidBeginEditing: и метод textDidEndEditing: .

A поиск «редактора полей» приводит к нескольким релевантным результатам в нескольких руководствах по программированию.

...