私は、各セルにテキストビューを持つテーブルビューを持っています。セルのテキストビューに入力されたテキストが常に表示されるように、テーブルビューをスクロールするにはどうすればよいですか?これは、テキストフィールドのテーブルビューとは異なります。なぜなら、新しい行が入力された場合、テキストフィールドはその高さを変更せず、textviewは変更しないからです。キーボードのtextviewsによるテーブルビューの回避
ありがとうございます!
私は、各セルにテキストビューを持つテーブルビューを持っています。セルのテキストビューに入力されたテキストが常に表示されるように、テーブルビューをスクロールするにはどうすればよいですか?これは、テキストフィールドのテーブルビューとは異なります。なぜなら、新しい行が入力された場合、テキストフィールドはその高さを変更せず、textviewは変更しないからです。キーボードのtextviewsによるテーブルビューの回避
ありがとうございます!
UITextView
は、戻りを押すたびに高さが変更されます。リターンが押されたときに検出し、UITableView
を少し上にスクロールします。
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
if([text isEqualToString:@"\n"]) {
CGPoint currentOffset=myTableView.contentOffset;
currentOffset.y-=10;
[myTableview setContentOffset:currentOffset];
}
return YES;
}
新しい変数 UITextView * activeTextViewを宣言します。
ViewDidLoadメソッドでは、show/hideの間にキーボード通知を登録します。
[self keyboardNotifications];
以下の方法を追加します。 - (ボイド)keyboardNotifications { //キーボードが表示されるときに通知を登録 [NSNotificationCenter defaultCenter] addObserver:自己 セレクタ:@selector(keyboardWillShow :) 名:UIKeyboardWillShowNotification オブジェクト:なし]。
// Register notification when the keyboard will be hide
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillHide:)
name:UIKeyboardWillHideNotification
object:nil];
}
cellForRowAtIndexPathのindexpathを使用してUITextviewタグを設定します。現在UITextViewでactiveTextViewとして設定
#pragma mark - Keyboard handling
-(void) keyboardWillShow:(NSNotification *)note {
if(activeTextView)
if ([TableCell count] < activeTextView.tag) { // It is validate table cell count and activeTextView.tag
NSDictionary* info = [note userInfo];
CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
tableV.contentInset = contentInsets;
tableV.scrollIndicatorInsets = contentInsets;
[tableV scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:activeTextView.tag inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:YES];
}
}
}
-(void) keyboardWillHide:(NSNotification *)note {
[UIView animateWithDuration:.3 animations:^(void) {
tableV.contentInset = UIEdgeInsetsZero;
tableV.scrollIndicatorInsets = UIEdgeInsetsZero;
}];
}
UITextViewデリゲート。
#pragma mark - UITextViewDelegate ::
- (BOOL)textViewShouldBeginEditing:(UITextView *)textView
{
return YES;
}
- (BOOL)textViewShouldEndEditing:(UITextView *)textView
{
return YES;
}
// To be link with your TextView event "Editing Did Begin"
// memoryze the current TextView
- (void)textViewDidBeginEditing:(UITextView *)textView
{
activeTextView = textView;
[textView becomeFirstResponder];
}
// To be link with your TextView event "Editing Did End"
// release current TextView
- (void)textViewDidEndEditing:(UITextView *)textView
{
activeTextView = nil;
[textView resignFirstResponder];
}
しかし、どのような場合、ユーザがリターンキーを押していないのですか?テキストは単に次の行にラップされます –
@BalázsVinczeこれをチェックしてくださいhttp://stackoverflow.com/questions/20008713/detect-moment-when-newline-starts-in-uitextview – Kamil