最近公司涉及到作家助手的功能,能撤销输入的文字,并能反撤销被撤销掉的文字。
该功能类似ios系统的摇一摇撤销输入。
当时也特迷茫,不知道从何下手,后来搜索了大量的资料,终于完成了这个功能,现在就将该功能的实现写出来,共勉。
这个功能涉及到ios原生类:NSUndomanager。这个类挺强大。废话不多说,直接上代码。
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
# 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 首行缩进 撤销输入 反撤销输入的实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
原文链接:http://blog.csdn.net/m0_37815556/article/details/78047669