У меня есть поле поиска, исходная ширина которого мала (потому что так оно выглядит лучше).Однако, когда пользователь нажимает на поле поиска, я хочу увеличить его ширину на определенную величину.Когда пользователь нажимает снаружи, я хочу изменить его размер до исходного размера.Я также хочу сделать все изменения размеров с анимацией.
Вот что у меня есть:
#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];
}
Когда поле щелкается и оно не редактируется, анимируйте его в большем размере.Всякий раз, когда поле заканчивается редактированием, анимируйте, только если в нем нет текста.Если в нем есть текст, лучше не уменьшать поле.