调整growFirstResponder和resignFirstResponder上的视图 - Cocoa(OS X)

时间:2012-01-01 21:26:40

标签: objective-c macos cocoa resize first-responder

我有一个原始宽度很小的搜索字段(因为它看起来更好)。但是,当用户点击搜索字段时,我想使其宽度增大一定量。当用户点击外部时,我想将其调整为原始大小。我还想用动画做所有调整大小。

这是我到目前为止所做的:

#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之后立即调用,使调整大小动画无效。但是,该字段仍处于活动状态并使插入点闪烁。有什么想法吗?

解决方案:

感谢Peter Hosey的回答,我设法解决了这个问题。这是我的解决方案:

#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 个答案:

答案 0 :(得分:3)

字段不处理文本输入。该责任归于字段编辑器,该编辑器是窗口拥有的NSText(或其某些子类)的实例。

您可以尝试实施the textDidBeginEditing: methodthe textDidEndEditing: method

A search for “field editor”在几个不同的编程指南中显示了几个相关结果。