gpt4 book ai didi

objective-c - 调整成为FirstResponder 和 resignFirstResponder 的 View 大小 - Cocoa (OS X)

转载 作者:行者123 更新时间:2023-12-03 16:32:49 24 4
gpt4 key购买 nike

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

这是我到目前为止所拥有的:

#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];
}

每当单击该字段且尚未编辑该字段时,都会将其动画化为更大的尺寸。每当字段结束编辑时,仅当字段没有文本时才设置动画。如果它有文本,那么最好不要使字段变小。

最佳答案

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

您可以尝试实现 the textDidBeginEditing: methodthe textDidEndEditing: method相反。

一个search for “field editor”在几个不同的编程指南中出现了几个相关结果。

关于objective-c - 调整成为FirstResponder 和 resignFirstResponder 的 View 大小 - Cocoa (OS X),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8695662/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com