iOS UITextView 首行縮進(jìn) 撤銷輸入 反撤銷輸入的實(shí)現(xiàn)代碼
最近公司涉及到作家助手的功能,能撤銷輸入的文字,并能反撤銷被撤銷掉的文字。
該功能類似ios系統(tǒng)的搖一搖撤銷輸入。
當(dāng)時(shí)也特迷茫,不知道從何下手,后來(lái)搜索了大量的資料,終于完成了這個(gè)功能,現(xiàn)在就將該功能的實(shí)現(xiàn)寫出來(lái),共勉。
這個(gè)功能涉及到ios原生類:NSUndomanager。這個(gè)類挺強(qiáng)大。廢話不多說(shuō),直接上代碼。
#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 = @" ";//要設(shè)置初始文本,不然段落體現(xiàn)不出來(lái)。
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineSpacing = 5; //行間距
paragraphStyle.firstLineHeadIndent = 30; /**首行縮進(jìn)寬度*/
paragraphStyle.alignment = NSTextAlignmentLeft;
NSDictionary *attributes = @{
NSFontAttributeName:[UIFont systemFontOfSize:13],
NSParagraphStyleAttributeName:paragraphStyle
};
_textView.attributedText = [[NSAttributedString alloc] initWithString:_textView.text attributes:attributes];
//監(jiān)聽textview文本改動(dòng)的通知
[[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{
//判斷當(dāng)前NSUndoManager的狀態(tài),是處于撤銷或者反撤銷的狀態(tài)
-(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];
}
總結(jié)
以上所述是小編給大家介紹的iOS UITextView 首行縮進(jìn) 撤銷輸入 反撤銷輸入的實(shí)現(xiàn)代碼,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- IOS 中UITextField和UITextView中字符串為空和空格的解決辦法
- IOS 開發(fā)UITextView回收或關(guān)閉鍵盤
- IOS 中UITextField,UITextView,UILabel 根據(jù)內(nèi)容來(lái)計(jì)算高度
- iOS UITextField、UITextView只限輸入中文、英文、數(shù)字及實(shí)時(shí)限制字符個(gè)數(shù)的封裝實(shí)現(xiàn)代碼
- iOS開發(fā)中Swift3 監(jiān)聽UITextView文字改變的方法(三種方法)
- iOS中的UITextView文字輸入光標(biāo)使用技巧小結(jié)
- iOS應(yīng)用開發(fā)中的文字選中操作控件UITextView用法講解
相關(guān)文章
iOS開發(fā)藍(lán)牙技術(shù)應(yīng)用增加無(wú)線連接功能
這篇文章主要為大家介紹了iOS開發(fā)藍(lán)牙技術(shù)應(yīng)用增加無(wú)線連接功能示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
淺談Unity中IOS Build Settings選項(xiàng)的作用
下面小編就為大家分享一篇淺談Unity中IOS Build Settings選項(xiàng)的作用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
詳解iOS中多倒計(jì)時(shí)場(chǎng)景的解決方案
在我們開發(fā)APP的過(guò)程中,或多或少都遇到過(guò)需要使用倒計(jì)時(shí)的場(chǎng)景,這篇文章主要介紹了詳解iOS中多倒計(jì)時(shí)場(chǎng)景的解決方案,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11
iOS使用AFN進(jìn)行單圖和多圖上傳的實(shí)例代碼
本篇文章中主要介紹了iOS使用AFN進(jìn)行單圖和多圖上傳的實(shí)例代碼,整理出單張和多張圖片上傳的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-04-04
IOS property屬性詳細(xì)介紹使用注意事項(xiàng)
這篇文章主要介紹了IOS property屬性詳細(xì)介紹使用注意事項(xiàng)的相關(guān)資料,需要的朋友可以參考下2017-02-02
iOS微信分享后關(guān)閉發(fā)送成功提示并返回應(yīng)用
這篇文章主要為大家詳細(xì)介紹了iOS微信分享后關(guān)閉發(fā)送成功提示并返回應(yīng)用的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
iOS利用CALayer實(shí)現(xiàn)動(dòng)畫加載的效果
網(wǎng)上關(guān)于動(dòng)畫加載的效果大多每一個(gè)圓圈都是使用UIView,因?yàn)檫@種容易控制,但是這里用的是CALayer,文中給出了詳細(xì)的實(shí)現(xiàn)示例代碼,相信會(huì)對(duì)大家的學(xué)習(xí)和理解很有幫助,感興趣的朋友們下面來(lái)一起看看吧。2016-10-10
iOS下PDF文件的瀏覽和涂鴉效果的簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要介紹了iOS下PDF文件的瀏覽和涂鴉效果的簡(jiǎn)單實(shí)現(xiàn),代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2015-10-10

