这篇文章主要介绍iOS如何使用UITextView实现首行缩进、撤销输入、反撤销输入功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
最近公司涉及到作家助手的功能,能撤销输入的文字,并能反撤销被撤销掉的文字。
该功能类似ios系统的摇一摇撤销输入。
当时也特迷茫,不知道从何下手,后来搜索了大量的资料,终于完成了这个功能,现在就将该功能的实现写出来,共勉。
这个功能涉及到ios原生类:NSUndomanager。这个类挺强大。废话不多说,直接上代码。
#import "ViewController.h"
@interface ViewController ()<UITextViewDelegate>{
UITextView *_textView;
NSUndoManager *_undomanager;
NSInteger _length;
UIButton *undobutton;
UIButton *redobutton;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIBarButtonItem *undoItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemUndo target:self action:@selector(undoitem)];
UIBarButtonItem *redoItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemRedo target:self action:@selector(redoitem)];
self.navigationItem.leftBarButtonItem = undoItem;
self.navigationItem.rightBarButtonItem = redoItem;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyBoardShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyBoardHidden:) name:UIKeyboardWillHideNotification object:nil];
_length = 0;
//初始化NSUndoManager
_undomanager = [[NSUndoManager alloc] init];
_textView = [[UITextView alloc]initWithFrame:CGRectMake(0, 200, self.view.frame.size.width, 400)];
_textView.backgroundColor = [UIColor yellowColor];
_textView.delegate = self;
_textView.font = [UIFont systemFontOfSize:15];
_textView.layer.cornerRadius = 5;
_textView.layer.masksToBounds = YES;
_textView.textColor = [UIColor blackColor];
_textView.text = @" ";//要设置初始文本,不然段落体现不出来。
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineSpacing = 5; //行间距
paragraphStyle.firstLineHeadIndent = 30; /**首行缩进宽度*/
paragraphStyle.alignment = NSTextAlignmentLeft;
NSDictionary *attributes = @{
NSFontAttributeName:[UIFont systemFontOfSize:13],
NSParagraphStyleAttributeName:paragraphStyle
};
_textView.attributedText = [[NSAttributedString alloc] initWithString:_textView.text attributes:attributes];
//监听textview文本改动的通知
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(changeTextViewText) name:UITextViewTextDidChangeNotification object:nil];
[self.view addSubview:_textView];
}
-(void)redoitem{
//反撤销
[_undomanager redo];
}
-(void)undoitem{
//撤销
[_undomanager undo];
}
-(void)keyBoardShow:(NSNotification *)noti{
NSDictionary *dic = noti.userInfo;
NSValue *aValue = [dic objectForKey:UIKeyboardFrameEndUserInfoKey];
CGRect keyboardRect = [aValue CGRectValue];
int height = keyboardRect.size.height;
[_textView setContentInset:UIEdgeInsetsMake(0, 0, height, 0)];
}
-(void)keyBoardHidden:(NSNotification *)noti{
[_textView setContentInset:UIEdgeInsetsMake(0, 0, 0, 0)];
}
- (void)setMyObjectTitle:(NSString *)newTitle{
//判断当前NSUndoManager的状态,是处于撤销或者反撤销的状态
-(void)textViewDidChange:(UITextView *)textView
if (_undomanager.isUndoing) {
NSInteger length = newTitle.length;
if (_textView.text.length>0) {
//获取
_textView.text = [_textView.text substringWithRange:NSMakeRange(0, _textView.text.length - length)];
[_undomanager registerUndoWithTarget:self
selector:@selector(setMyObjectTitle:)
object:newTitle];
}
}else if (_undomanager.isRedoing){
_textView.text = [_textView.text stringByAppendingString:newTitle];
[_undomanager registerUndoWithTarget:self
selector:@selector(setMyObjectTitle:)
object:newTitle];
}else{
NSString *currentText = _textView.text;
if (newTitle != currentText) {
_textView.text = currentText;
[_undomanager registerUndoWithTarget:self
selector:@selector(setMyObjectTitle:)
object:newTitle];
}else{
_textView.text = newTitle;
}
}
}
-(void)changeTextViewText{
if (_textView.text.length>0) {
undobutton.enabled = YES;
}else{
undobutton.enabled = NO;
redobutton.enabled = NO;
}
NSString *text ;
if (_length != 0) {
NSInteger textLength = _textView.text.length;
if (textLength > _length) {
NSInteger newLength = textLength - _length;
text = [NSString stringWithFormat:@"%@",[_textView.text substringWithRange:NSMakeRange(_length, newLength)]];
}else{
text = _textView.text;
}
}else{
text = _textView.text;
}
_length = _textView.text.length;
[self setMyObjectTitle:text];
}
以上是“iOS如何使用UITextView实现首行缩进、撤销输入、反撤销输入功能”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注天达云行业资讯频道!