林讓我的工作UIscroll按照本文檔滾動文本框覆蓋鍵盤
滾動當過一個文本框被鍵盤封鎖然而可悲的是...有一個變量提到,activeField我無法弄清楚它是如何聲明的。我真的很喜歡,如果有人可能會建議如何/何處被宣佈,或者甚至是在鍵盤被激活時滾動的解決方案將會有所幫助。
謝謝
林讓我的工作UIscroll按照本文檔滾動文本框覆蓋鍵盤
滾動當過一個文本框被鍵盤封鎖然而可悲的是...有一個變量提到,activeField我無法弄清楚它是如何聲明的。我真的很喜歡,如果有人可能會建議如何/何處被宣佈,或者甚至是在鍵盤被激活時滾動的解決方案將會有所幫助。
謝謝
爲了回答您的具體問題,因爲Apple Documentation只會被使用activeField的尺寸數據,可以簡單地聲明這是私人全球的UIView * activeField,它會爲文本框,textViews等都是一樣的工作。
但是,他們的代碼實際上並不能很好地工作。我不得不對他們的代碼進行一些更改以使我的工作正常進行。這個代碼基本上是他們的一些小調整,以處理下面列出的所有情況:
1)如果你有一個較小的scrollView嵌套在視圖內,而不是全屏幕scrollView,它仍然工作。 2)如果您想將文本字段向下移動到鍵盤焦點區域並將其從鍵盤後面向上移動。 3)適用於各種尺寸的textViews和textField 4)如果鍵盤當前正在顯示,它會將任何新近點擊的字段移動到焦點區域 5)如果您的內容已經滾動並調用鍵盤,則工作 6)適用於所有的鍵盤尺寸爲所有設備(沒有硬編碼常量)
首先,創建私有變量,這些:
UIView *_activeField;
CGFloat _keyboardHeight;
BOOL _isShowingKeyboard;
接下來,只要剪切和將此代碼粘貼到您的視圖控制器(它看起來像很多但並不糟糕)。
#pragma mark TextFieldKeyboardScrolling
- (void)registerForKeyboardNotifications {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:) name:UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillBeHidden:) name:UIKeyboardWillHideNotification object:nil];
}
- (void)adjustInputFieldsForKeyboard {
CGFloat keyBoardTopInScrollView = self.view.frame.size.height - _keyboardHeight - self.scrollView.frame.origin.y;
CGFloat inputFieldBottomInVisibleScrollView = _activeField.frame.origin.y - self.scrollView.contentOffset.y + 30 /* small buffer for cursor size */;
CGPoint scrollPoint;
if (keyBoardTopInScrollView > inputFieldBottomInVisibleScrollView) {
scrollPoint = CGPointMake(0.0, self.scrollView.contentOffset.y - (keyBoardTopInScrollView - inputFieldBottomInVisibleScrollView));
} else {
scrollPoint = CGPointMake(0.0, self.scrollView.contentOffset.y + (inputFieldBottomInVisibleScrollView - keyBoardTopInScrollView));
}
[self.scrollView setContentOffset:scrollPoint animated:YES];
}
- (void)keyboardWasShown:(NSNotification*)aNotification {
_isShowingKeyboard = YES;
NSDictionary* info = [aNotification userInfo];
_keyboardHeight = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size.height;
UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, _keyboardHeight, 0.0);
self.scrollView.contentInset = contentInsets;
self.scrollView.scrollIndicatorInsets = contentInsets;
[self adjustInputFieldsForKeyboard];
}
- (void)keyboardWillBeHidden:(NSNotification*)aNotification {
_isShowingKeyboard = NO;
UIEdgeInsets contentInsets = UIEdgeInsetsZero;
self.scrollView.contentInset = contentInsets;
self.scrollView.scrollIndicatorInsets = contentInsets;
}
#pragma mark UITextFieldDelegate
- (void)textFieldDidBeginEditing:(UITextField *)textField {
_activeField = textField;
if (_isShowingKeyboard) {
[self adjustInputFieldsForKeyboard];
}
}
- (void)textFieldDidEndEditing:(UITextField *)textField {
_activeField = nil;
}
就是這樣,只需調用[self registerForKeyboardNotifications];在你的viewDidLoad方法中,將你的scrollView插座和textField/textView代表放在故事板中,並且你已經完成設置。
鍵盤纔有效,當texfields的一個被激活(成了第一個響應者)。所以,你要聽的UITextField委託方法時看到併成爲的UITextField第一個響應。 - (空)textFieldDidBeginEditing:(*的UITextField)文本框
,如果你指定一個標記來您的文本字段或使其伊娃還可以瞭解哪些的UITextField變得活躍,也獲得了框架。
我不使用滾動視圖或按照上述文檔。
下面是如何在不使用滾動視圖 在我
textFieldShouldBeginEditing
CGRect frame = self.view.frame;
frame.origin.y = <some negative value>;
self.view.frame = frame
,並在我的
textFieldShouldEndEditing
CGRect frame = self.view.frame;
frame.origin.y = <some positive value>; // absolute value of your above negative value
self.view.frame = frame
以上爲我工作。記住這些是文本字段委託方法。所以你需要設置你的委託。
我瞭解的第一個響應者的一切......我不明白這是 「活躍的領域」 - (空)textFieldDidBeginEditing:(*的UITextField)文本框 { activeField =文本框; } 我不知道如何傳遞給它什麼文本字段是第一響應者 – 2012-08-09 19:43:16
它只是一個伊娃保存觸發委託方法的文本字段。 – 2012-08-09 19:45:19
我想,但我不知道如何在.h文件中聲明「activefield」 int activeField;? – 2012-08-09 20:15:35