UI: 使用 UITextView 显示多行文本(有键盘处理)

问题:

使用 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];
}
时间: 2024-08-07 15:26:52

UI: 使用 UITextView 显示多行文本(有键盘处理)的相关文章

IOS 自定义UIBUTTON 直接拖个xib 就能在button上显示多行文本 并且添加了点击的效果

拖个button继承一下  几行代码 就搞定 自用效果还行 IOS 自定义UIBUTTON 直接拖个xib 就能在button上显示多行文本 并且添加了点击的效果,布布扣,bubuko.com

Dev GridControl,GridView 显示多行文本及合并相同单元格

显示多行文本的方法 首先把gridcontrol的views的Optionsview里的RowAutoHeight设置为True 在In-place Editor Repository 里添加 MemoEdit控件 在Columns里选择对应的列,在ColumnEdit里选择MemoEdit控件 合并相同单元格的方法 1:设置OptionsView.AllowCellMerge 为 True 此时所有列的相邻行的相同单元格都会合并 2:如部分列不需要自动合并功能 ,只需设置指定列的 Option

Android在非UI线程中显示Toast

[java] view plaincopyprint? public void showToast(String msg){ Looper.prepare(); Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show(); Looper.loop(); } public void showToast(String msg){ Looper.prepare(); Toast.makeText(getApplicat

UI- UITextView

//  ViewController.m //  fiedl //  Created by cqy on 15/11/16. //  Copyright (c) 2015年 cqy. All rights reserved. #import "ViewController.h" @interface ViewController ()<UITextViewDelegate> @end @implementation ViewController - (void)viewDi

Flash Stage3D 在2D UI 界面上显示3D模型问题完美解决

一直以来很多Stage3D开发者都在为3D模型在2DUI上显示的问题头疼.Stage3D一直是在 Stage2D下面.为了做到3D模型在2DUI上显示通常大家有几种实现方式,下面来说说这几种实现方式吧. 实现方式1: 在2DUI上挖个洞透过去显示3D层.这种做法的缺陷在于如果两个UI界面同时打开就会UI错层显示错乱.为了解决这问题很多程序员选择了当挖洞显示3D的UI打时把其他界面隐藏掉,用户体验超差. 实现方式2: 利用Context3D 的 drawToBitmapData API 实时将3D

IOS开发UI基础UITextView相关属性

UITextView相关属性 •    text: 设置textView中文本_textView.text = @"Now is the time for all good developers to come to serve their country.\n\nNow is the time for all good developers to come to serve their country."; // 设置它显示的内容    •    font:设置textView中文字

android 在子线程中操作UI 导致Fragment显示空白问题

需求是这样的 当没网络的请求下就显示缓存中的数据,这样做是为了在没网的情况下 不至于界面什么都没有,给用户的体验效果不好,所以就加了个缓存机制,但是这个缓存的代码是我从上家公司拷贝过来的,没怎么仔细看,当在没网的情况下,出现切换tab页,fragment显示空白问题,连标题栏都显示不出来,   后来我就把缓存的那个 注释了  问题就好了,于是问题定位就是缓存这块了,找到问题就相当于问题解决了一半,然后发现那个回调是在子线程中的,而我在这个回调中操作了UI, 所以才会导致界面空白  在此记录下 版

JQUERY EASY UI +TREE +SERVLET 显示菜单的例子

1.准备工作 (1)jquery easy ui (2)mysql数据 (3)eclipse开发环境等等 2.开发前端 <body class="easyui-layout"> <div data-options="region:'north',title:'header',split:true,noheader:true" style="height:60px;background:#666;"><div clas

iOS开篇——UI之UITextView

创建UITextView //创建一个单例对象 存储_str字符串 NSUserDefaults * hd = [NSUserDefaults standardUserDefaults]; _str = [hd objectForKey:@"str"]; UITextView * textView = [[UITextView alloc]initWithFrame:CGRectMake(50, 100, 200, 200)]; textView.delegate = self; te