最近公司涉及到作家助手的功能,能撤销输入的文字,并能反撤销被撤销掉的文字。
该功能类似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