91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

iOS如何使用UITextView實現首行縮進、撤銷輸入、反撤銷輸入功能

發布時間:2021-07-10 13:45:35 來源:億速云 閱讀:488 作者:小新 欄目:移動開發

這篇文章主要介紹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實現首行縮進、撤銷輸入、反撤銷輸入功能”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

凤庆县| 贵阳市| 溧水县| 孟连| 平安县| 岢岚县| 文水县| 杭锦旗| 临漳县| 柘城县| 龙南县| 久治县| 砀山县| 渭源县| 海安县| 普定县| 新河县| 瑞安市| 斗六市| 平遥县| 龙游县| 南丰县| 盐津县| 宝鸡市| 武安市| 东乌珠穆沁旗| 淳安县| 高唐县| 鹰潭市| 宜州市| 福贡县| 昌宁县| 来凤县| 铜山县| 哈密市| 花莲市| 双桥区| 崇义县| 大化| 睢宁县| 南溪县|