问题:
使用 UITextView 显示多行文本
创建一个简单的TextView:
- (void)viewDidLoad{ [super viewDidLoad]; self.view.backgroundColor = [UIColor whiteColor]; self.myTextView = [[UITextView alloc] initWithFrame:self.view.bounds]; self.myTextView.text = @"Some text here..."; self.myTextView.font = [UIFont systemFontOfSize:16.0f]; [self.view addSubview:self.myTextView]; }
当TextView中的文字很多时,点击text view,你会发现一个键盘将会从屏幕底部弹出来,遮盖了text view 几乎一半的区域。这意味着,假如用户开始输入文本并达到文本视图中间时,用户将会看不 见之后输入的文本。
为了能纠正这个问题,我们需要监听一些通知,如下:
UIKeyboarWillShowNotification
无论是什么 UI 组建(text field,text view 等)引起的键盘显示,系统都会发送这个通知。
UIKeyboardDidShowNotification
当键盘已经显示在屏幕上时系统将会发送这个通知。
UIKeyboardWillHideNotification
当键盘即将被隐藏时系统将会发送这个通知。
UIKeyboardDidHideNotification
当键盘完全隐藏时系统将会发送这个通知。
注意:键盘通知包含了一个字典,可以通过 userInfo 这个属性使用它,他指定 了键盘在屏幕上的边界。这个属性属于 NSDictionary 类型。在这个字典里, 其中有一个名为 UIKeyboardFrameEndUserInfoKey 的关键字,它包含了一个 NSValue 类型的对象,这个对象包含一个当键盘完全显示时的矩形边界。这个矩形区域被标记为一个 CGRect。
所以我们的策略就是去发现键盘什么时候准备在屏幕上显示然后以何种方式调整视图。 为了实现这个策略,我们将会用到 UITextView 的 contentInset 这个属性来指定文本内容的边 距,包括到文本视图的顶部,左边,底部和右边的距离。
代码:
- (void)viewWillAppear:(BOOL)animated{ [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(handleKeyboardDidShow:) name:UIKeyboardDidShowNotification object:nil]; [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(handleKeyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; } - (void)viewWillDisappear:(BOOL)animated{ [super viewWillDisappear:animated]; [[NSNotificationCenter defaultCenter]removeObserver:self]; }
在这段代码中,在方法 viewWillAppear:开始监听键盘通知,在方法 viewWillDisappear 结束监听。在不需要监听时,移除监听者是非常重要的,其中背后的原因是假如在视图控制器 不再显示的时候,不移除作为监听键盘通知的视图控件,其他任何视图控件的部件发出的键 盘通知将会导致通知中心也会发送这些通知到这个视图控制器。
- (void)handleKeyboardDidShow:(NSNotification *)paramNitification{ //得到键盘的frame NSValue *keyboardRectAsObject = [[paramNitification userInfo]objectForKey:UIKeyboardFrameEndUserInfoKey]; //存入keyboardRect CGRect keyboardRect; [keyboardRectAsObject getValue:&keyboardRect]; //给TextView下边距,使其达到顶端的键盘 _myTextView.contentInset = UIEdgeInsetsMake(0, 0, keyboardRect.size.height, 0); } - (void)handleKeyboardWillHide:(NSNotification *)paramNotification{ //将TextView变回原来大小 _myTextView.contentInset = UIEdgeInsetsZero; }
//接收到通知后一系列处理
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. self.view.backgroundColor = [UIColor whiteColor]; _myTextView = [[UITextView alloc]initWithFrame:self.view.bounds]; _myTextView.text = @"Some text here..."; _myTextView.font = [UIFont systemFontOfSize:16.0f]; [self.view addSubview:_myTextView]; }