我有一个原始宽度很小的搜索字段(因为它看起来更好)。但是,当用户点击搜索字段时,我想使其宽度增大一定量。当用户点击外部时,我想将其调整为原始大小。我还想用动画做所有调整大小。
这是我到目前为止所做的:
#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];
}
每当单击该字段并且它尚未编辑时,将设置为更大的动画。每当字段结束编辑时,仅在没有文本时才进行动画处理。如果它有文本,那么最好不要缩小字段。
答案 0 :(得分:3)
字段不处理文本输入。该责任归于字段编辑器,该编辑器是窗口拥有的NSText(或其某些子类)的实例。
您可以尝试实施the textDidBeginEditing:
method和the textDidEndEditing:
method。
A search for “field editor”在几个不同的编程指南中显示了几个相关结果。