iOS鍵盤彈出高度以及動畫時間獲取

iOS鍵盤彈出隱藏主要通過通知獲取

// Each notification includes a nil object and a userInfo dictionary containing the

// begining and ending keyboard frame in screen coordinates. Use the various UIView and

// UIWindow convertRect facilities to get the frame in the desired coordinate system.

// Animation key/value pairs are only available for the "will" family of notification.

UIKIT_EXTERN NSString *const UIKeyboardWillShowNotification __TVOS_PROHIBITED;

UIKIT_EXTERN NSString *const UIKeyboardDidShowNotification __TVOS_PROHIBITED;

UIKIT_EXTERN NSString *const UIKeyboardWillHideNotification __TVOS_PROHIBITED;

UIKIT_EXTERN NSString *const UIKeyboardDidHideNotification __TVOS_PROHIBITED;

具體獲取方法:

添加觀察

- (void)keyboardWillShow:(NSNotification *)notification {

// 獲取通知的信息字典

NSDictionary *userInfo = [notification userInfo];

// 獲取鍵盤彈出后的rect

NSValue* aValue = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];

CGRect keyboardRect = [aValue CGRectValue];

// 獲取鍵盤彈出動畫時間

NSValue *animationDurationValue = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey];

NSTimeInterval animationDuration;

[animationDurationValue getValue:&animationDuration];

// do something...

}

- (void)keyboardWillHide:(NSNotification *)notification {

// 獲取通知信息字典

NSDictionary* userInfo = [notification userInfo];

// 獲取鍵盤隱藏動畫時間

NSValue *animationDurationValue = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey];

NSTimeInterval animationDuration;

[animationDurationValue getValue:&animationDuration];

// do something...

}

拓展

為了避免工程中每次獲取鍵盤彈出隱藏都添加一次觀察,特地寫了一個鍵盤彈出隱藏的模塊,將添加通知以及獲取鍵盤高度和動畫時間進行了一個簡單的封裝。

先看.h文件

@protocol LMJKeyboardShowHiddenNotificationCenterDelegate // height 鍵盤當前高度

// animationDuration 彈出隱藏動畫時間

// isShow 是否是彈出

- (void)showOrHiddenKeyboardWithHeight:(CGFloat)height withDuration:(CGFloat)animationDuration isShow:(BOOL)isShow;

@end

@interface LMJKeyboardShowHiddenNotificationCenter : NSObject

// 這是一個單例,通過該方法獲取單例對象

+ (LMJKeyboardShowHiddenNotificationCenter *)defineCenter;

// 代理在這里是一個重要的設(shè)置,如果你要在當前對象中獲取鍵盤的彈出隱藏一定要在這之前將單例的代理設(shè)置成這個對象

@property (nonatomic,assign) id? delegate;

// 在使用LMJKeyboardShowHiddenNotificationCenter的對象的dealloc函數(shù)中調(diào)用該函數(shù)

- (void)closeCurrentNotification;

@end

.m文件

@implementation LMJKeyboardShowHiddenNotificationCenter

+ (LMJKeyboardShowHiddenNotificationCenter *)defineCenter{

static LMJKeyboardShowHiddenNotificationCenter * center = nil;

if (center == nil) {

center = [[LMJKeyboardShowHiddenNotificationCenter alloc] init];

center.delegate = nil;

// 添加觀察

[[NSNotificationCenter defaultCenter] addObserver:center selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];

[[NSNotificationCenter defaultCenter] addObserver:center selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];

}

return center;

}

- (void)setDelegate:(id)delegate{

_delegate = delegate;

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];

}

- (void)keyboardWillShow:(NSNotification *)notification {

// 獲取通知的信息字典

NSDictionary *userInfo = [notification userInfo];

// 獲取鍵盤彈出后的rect

NSValue* aValue = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];

CGRect keyboardRect = [aValue CGRectValue];

// 獲取鍵盤彈出動畫時間

NSValue *animationDurationValue = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey];

NSTimeInterval animationDuration;

[animationDurationValue getValue:&animationDuration];

// 檢查代理是否為空

if ([self isBlanceObject:self.delegate]) {

return;

}

// 調(diào)用代理

if ([self.delegate respondsToSelector:@selector(showOrHiddenKeyboardWithHeight:withDuration:isShow:)]) {

[self.delegate showOrHiddenKeyboardWithHeight:keyboardRect.size.height withDuration:animationDuration isShow:YES];

}

}

- (void)keyboardWillHide:(NSNotification *)notification {

// 獲取通知信息字典

NSDictionary* userInfo = [notification userInfo];

// 獲取鍵盤隱藏動畫時間

NSValue *animationDurationValue = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey];

NSTimeInterval animationDuration;

[animationDurationValue getValue:&animationDuration];

// 檢查代理是否為空

if ([self isBlanceObject:self.delegate]) {

return;

}

// 調(diào)用代理

if ([self.delegate respondsToSelector:@selector(showOrHiddenKeyboardWithHeight:withDuration:isShow:)]) {

[self.delegate showOrHiddenKeyboardWithHeight:0.0 withDuration:animationDuration isShow:NO];

}

}

// 判斷對象是否為空

- (BOOL)isBlanceObject:(id)object{

if (object == nil || object == NULL) {

return YES;

}

if ([object isKindOfClass:[NSNull class]]) {

return YES;

}

return NO;

}

- (void)closeCurrentNotification{

self.delegate = nil;

[[NSNotificationCenter defaultCenter] removeObserver:self];

}

- (void)dealloc{

[[NSNotificationCenter defaultCenter] removeObserver:self];

}

@end

演示Demo GitHub地址:

https://github.com/MajorLMJ/LMJKeyboardShowHiddenNotificationCenter

http://www.cocoachina.com/ios/20160926/17632.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 在ios開發(fā)中,鍵盤很常用。在sdk版本5.0以前,鍵盤高度是固定值216px;5.0出來以后,鍵盤高度會隨著鍵盤...
    petter102閱讀 3,479評論 1 1
  • 方便快捷的收鍵盤: [[[UIApplicationsharedApplication]keyWindow]end...
    小暖風閱讀 5,144評論 0 4
  • //設(shè)置尺寸為屏幕尺寸的時候self.window = [[UIWindow alloc] initWithFra...
    LuckTime閱讀 838評論 0 0
  • 每個人都可毫不猶豫的作出這一簡單動作——微笑,盡管毫不費力,效果卻非同尋常。 生活需要微笑,需要微笑面對,當你愉悅...
    瘋子的天下閱讀 338評論 0 1
  • 今天我在益陽買買買了,有喜歡的東西是一方面,另一方面,是為店里的優(yōu)質(zhì)服務(wù)買單。 今年我胖了不少,全身都胖了一圈了。...
    謙與芊尋閱讀 264評論 0 0