iOS开发-UITextView的用法及技巧(ios7下光标bug解决方案)

2023-12-22 02:18

本文主要是介绍iOS开发-UITextView的用法及技巧(ios7下光标bug解决方案),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、新建一个textView 
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//初始化
UITextView *textView = [[[UITextView alloc] init] autorelease];
//设置代理 需在interface中声明UITextViewDelegate
textView.delegate = self;
//字体大小
textView.font = [UIFont systemFontOfSize:16];
//添加滚动区域
textView.contentInset = UIEdgeInsetsMake(-11, -6, 0, 0);
//是否可以滚动
textView.scrollEnabled = NO;
//获得焦点
[textView becomeFirstResponder];
?
1
[self.view addSubview:textView];
二、键盘操作 
?
1
2
3
4
5
//返回键的类型
textView.returnKeyType = UIReturnKeyDefault;
//键盘类型
textView.keyboardType = UIKeyboardTypeDefault;
三、隐藏键盘的几种方式 

个人还是认为最方便的是在键盘上加上一个ToolBar,在上面加上一个按钮来隐藏键盘 

①在键盘上加上隐藏按钮 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//定义一个toolBar
UIToolbar * topView = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 30)];
//设置style
[topView setBarStyle:UIBarStyleBlack];
//定义两个flexibleSpace的button,放在toolBar上,这样完成按钮就会在最右边
UIBarButtonItem * button1 =[[UIBarButtonItem  alloc]initWithBarButtonSystemItem:                                        UIBarButtonSystemItemFlexibleSpace target:self action:nil];
UIBarButtonItem * button2 = [[UIBarButtonItem  alloc]initWithBarButtonSystemItem:                                        UIBarButtonSystemItemFlexibleSpace target:self action:nil];
//定义完成按钮
UIBarButtonItem * doneButton = [[UIBarButtonItem alloc]initWithTitle:@ "完成" style:UIBarButtonItemStyleDone  target:self action:@selector(resignKeyboard)];
     
//在toolBar上加上这些按钮
NSArray * buttonsArray = [NSArray arrayWithObjects:button1,button2,doneButton,nil];    
[topView setItems:buttonsArray];
[textView setInputAccessoryView:topView];
?
1
2
3
4
//隐藏键盘
- ( void )resignKeyboard {
     [textView resignFirstResponder];
}
最终效果 

还有几种也可隐藏键盘的方式 

②用回车键,前提是你的textView中不需要用到回车键 

?
1
2
3
4
5
6
7
-( BOOL )textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
  if ([text isEqualToString:@ "\n" ])
{
[textView resignFirstResponder]; return NO;
}
  return YES;
}

③触摸空白处隐藏键盘 

?
1
2
3
4
5
-( void )touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
     //隐藏键盘
     [textView resignFirstResponder];
}
四、使键盘不挡住输入框 

    在view中添加一个子view,设置此子view的tag值为1000,在此view上添加一个textView和一个发送按钮,如下图;我们要达到textView的键盘弹出时,整个View往上平移,键盘消失,view往下平移的效果,模拟发送短信的界面。

设置textView圆角 

?
1
2
//设置textView圆角
[self.textView.layer setCornerRadius:10];

①、在viewWillAppear中添加键盘监听事件 

?
1
2
3
4
5
6
7
//添加键盘的监听事件
     
     //注册通知,监听键盘弹出事件
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];
     
     //注册通知,监听键盘消失事件
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHidden) name:UIKeyboardDidHideNotification object:nil];
②、完成①selector中键盘弹出keyboardDidShow:和消失keyboardDidHidden方法 

    在.m文件#import后面添加 

?
1
2
3
4
//动画时间
#define kAnimationDuration 0.2
//view高度
#define kViewHeight 56
键盘出现 
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 键盘弹出时
-( void )keyboardDidShow:(NSNotification *)notification
{
     
     //获取键盘高度
     NSValue *keyboardObject = [[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey];
     
     CGRect keyboardRect;
     
     [keyboardObject getValue:&keyboardRect];
     
     //调整放置有textView的view的位置
     
        //设置动画
     [UIView beginAnimations:nil context:nil];
     
        //定义动画时间
     [UIView setAnimationDuration:kAnimationDuration];
     
        //设置view的frame,往上平移
     [(UIView *)[self.view viewWithTag:1000] setFrame:CGRectMake(0, self.view.frame.size.height-keyboardRect.size.height-kViewHeight, 320, kViewHeight)];
     
     [UIView commitAnimations];
     
}
键盘消失 
?
1
2
3
4
5
6
7
8
9
10
//键盘消失时
-( void )keyboardDidHidden
{
     //定义动画
     [UIView beginAnimations:nil context:nil];
     [UIView setAnimationDuration:kAnimationDuration];
     //设置view的frame,往下平移
     [(UIView *)[self.view viewWithTag:1000] setFrame:CGRectMake(0, self.view.frame.size.height-kViewHeight, 320, kViewHeight)];
     [UIView commitAnimations];
}
效果图: 

iOS7光标问题

PS:有网友遇到textView在ios7上出现编辑进入最后一行时光标消失,看不到最后一行,变成盲打,stackOverFlow网站上有大神指出,是ios7本身bug,加上下面一段代码即可(网友调试得出,在此mark一下,有问题,欢迎大神们指出)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-( void )textViewDidChange:(UITextView *)textView {
     CGRect line = [textView caretRectForPosition:
                    textView.selectedTextRange.start];
     CGFloat overflow = line.origin.y + line.size.height
     - ( textView.contentOffset.y + textView.bounds.size.height
        - textView.contentInset.bottom - textView.contentInset.top );
     if ( overflow > 0 ) {
         // We are at the bottom of the visible text and introduced a line feed, scroll down (iOS 7 does not do it)
         // Scroll caret to visible area
         CGPoint offset = textView.contentOffset;
         offset.y += overflow + 7; // leave 7 pixels margin
         // Cannot animate with setContentOffset:animated: or caret will not appear
         [UIView animateWithDuration:.2 animations:^{
             [textView setContentOffset:offset];
         }];
     }
}

这篇关于iOS开发-UITextView的用法及技巧(ios7下光标bug解决方案)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/522278

相关文章

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

解读GC日志中的各项指标用法

《解读GC日志中的各项指标用法》:本文主要介绍GC日志中的各项指标用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基础 GC 日志格式(以 G1 为例)1. Minor GC 日志2. Full GC 日志二、关键指标解析1. GC 类型与触发原因2. 堆

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.