首页 > 系统 > iOS > 正文

iOS UITextView 首行缩进 撤销输入 反撤销输入的实现代码

2020-07-26 02:40:57
字体:
来源:转载
供稿:网友

 最近公司涉及到作家助手的功能,能撤销输入的文字,并能反撤销被撤销掉的文字。

该功能类似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 首行缩进 撤销输入 反撤销输入的实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对武林网网站的支持!

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表