1

我有一个自定义UITextField类,它需要在显示后抓取键盘的矩形。所以,在课堂上我听UIKeyboardWillShowNotification并从UIKeyboardFrameEndUserInfoKey. 如果当前未显示键盘,这将非常有用。但是,如果键盘已经显示 - 例如当您在文本字段之间点击时 -UIKeyboardWillShowNotification只会在第一个被点击的文本字段时触发。对于所有其他文本字段,我无法知道键盘的 rect 是什么。

关于在键盘显示后如何获得键盘的 rect 有什么建议吗?

4

1 回答 1

1

给你AppDelegate一个keyboardFrame财产。进行适当的AppDelegate观察UIKeyboardWillShowNotificationUIKeyboardWillHideNotification更新属性。将属性设置CGRectNull为隐藏键盘时,或添加单独的keyboardIsShowing属性。(您可以测试CGRectNull使用该CGRectIsNull功能。)

然后任何对象都可以使用这个咒语随时检查键盘框架:

[[UIApplication sharedApplication].delegate keyboardFrame]

如果您不想将其放入您的应用程序委托中,您可以创建一个单独的单例类,例如

@interface KeyboardProxy

+ (KeyboardProxy *)sharedProxy;

@property (nonatomic, readonly) CGRect frame;
@property (nonatomic, readonly) BOOL visible;

@end

@implementation KeyboardProxy

#pragma mark - Public API

+ (KeyboardProxy *)sharedProxy {
    static dispatch_once_t once;
    static KeyboardProxy *theProxy;
    dispatch_once(&once, ^{
        theProxy = [[self alloc] init];
    });
    return theProxy;
}

@synthesize frame = _frame;

- (BOOL)visible {
    return CGRectIsNull(self.frame);
}

#pragma mark - Implementation details

- (id)init {
    if (self = [super init]) {
        _frame = CGRectNull;
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
    }
    return self;
}

- (void)keyboardWillShow:(NSNotification *)note {
    _frame = [note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
}

- (void)keyboardWillHide:(NSNotification *)note {
    _frame = CGRectNull;
}

@end

但是如果你使用一个单独的单例,你需要确保[KeyboardProxy sharedProxy]从你的应用代理调用,application:didFinishLaunchingWithOptions:这样单例就不会错过任何通知。

于 2013-03-22T05:36:23.473 回答