国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

iOS UITextView 首行縮進 撤銷輸入 反撤銷輸入的實現代碼

2019-10-21 18:44:34
字體:
來源:轉載
供稿:網友

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

該功能類似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 首行縮進 撤銷輸入 反撤銷輸入的實現代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VEVB武林網網站的支持!


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 建始县| 游戏| 师宗县| 都昌县| 龙陵县| 阳江市| 余干县| 广安市| 武安市| 淄博市| 南充市| 两当县| 东阳市| 桐乡市| 会泽县| 沁阳市| 崇义县| 长汀县| 阳城县| 宁德市| 辛集市| 平塘县| 开原市| 五指山市| 沛县| 三亚市| 满城县| 灵璧县| 南康市| 邛崃市| 顺义区| 潢川县| 余江县| 旬阳县| 都江堰市| 含山县| 新干县| 大田县| 赤水市| 汽车| 普兰店市|