您的位置:首页 > 移动开发 > IOS开发

iOS富文本编辑器之更"优雅的"实现方法

2016-12-15 00:00 10 查看
原文出处:五阿哥永琪

前言:最近帮公司的一名程序员搞一个项目的收尾工作,差一个富文本编辑器功能未实现,时间紧迫,调研了下网上的解决方法均较为繁琐.不得已找了个别门来实现该问题,且看下文

需要实现的效果


需要实现的效果
解决思路

采用webview加载一个本地html文件,该html内部编写好js方法用于与oc相互调用最终输出该富文本字符串传输给服务器

为什么选择这样的方式

服务端要求我最终返回的数据格式为:

1
2
3
4
5
6
7
8
{
@"Id":"当时新建模板这个不传,更新模板必须传",
@"title":"模板标题",
@"text":"<pdir="ltr">测试文字</p>
![](http://upload-images.jianshu.io/upload_images/1694866-a9a1da57455b2054.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)<p>![](http://pic.baikemy.net/apps/kanghubang/486/3486/1457968327238.amr@type=1@duration=1852)<p>",
@"sendstr":"22372447516929如果模板要保存同时发送给患者,这个值必须传,可以多个患者发送患者id以逗号隔开"
@"1457968280769.jpg":
@"文件名":"BACES64数据这个是多个图片或语音一起上传"}
其中text字段即为富文本字段.
同时又需要编辑已有文本等功能.倘若用原生代码写较为复杂,最终选择了使用本地html代码实现

解决步骤
新建一个richTextEditor.html文件
1.页面设计

1
2
3
4
5
6
7
8
9
10
11
/*界面不要太简单一个简单的输入框*/
<style>
img
{display:block;width:100%;margin-top:10px;margin-bottom:10px;
}
[contenteditable=true]:empty:before
{content:attr(placeholder);color:#a6a6a6;
}
#content
{padding:10px0;font-family:Helvetica;-webkit-tap-highlight-color:rgba(0,0,0,0);min-height:100px;
}<divid="content"contenteditable="true"onmouseup="saveSelection();"onkeyup="saveSelection();"onfocus="restoreSelection();"placeholder="轻触屏幕开始编辑正文"></div>
2.js方法设计

插入图片

1
2
3
4
5
6
7
8
9
10
functioninsertImage(imageName,imagePath){
restoreSelection();varimageElement=document.createElement('img');varbreakElement=document.createElement('div');
imageElement.setAttribute('src',imagePath);
imageElement.setAttribute('id',imageName);
breakElement.innerHTML="<br>";
editableContent.appendChild(imageElement);
editableContent.appendChild(breakElement);
}functionupdateImageURL(imageName,imageURL){varselectedElement=document.getElementById(imageName);
selectedElement.setAttribute('src',imageURL);
}
获取html代码

1
2
3
functionplaceHTMLToEditor(html){
editableContent.innerHTML=html;
}
4.oc与js相互调用

oc端实例一个webview加载该html和一个按钮用于添加图片

1
2
3
4
5
6
7
self.webView=[[UIWebViewalloc]initWithFrame:CGRectMake(0,64+50,[UIScreenmainScreen].bounds.size.width,self.view.frame.size.height-50)];self.webView.delegate=self;
[self.viewaddSubview:self.webView];NSBundle*bundle=[NSBundlemainBundle];NSURL*indexFileURL=[bundleURLForResource:@"richTextEditor"withExtension:@"html"];

[self.webViewsetKeyboardDisplayRequiresUserAction:NO];
[self.webViewloadRequest:[NSURLRequestrequestWithURL:indexFileURL]];UIButton*btn=[UIButtonbuttonWithType:UIButtonTypeCustom];
[btnaddTarget:selfaction:@selector(addImage:)forControlEvents:UIControlEventTouchUpInside];
[self.viewaddSubview:btn];
添加完图片后与html对接

1
2
3
4
//以时间戳重命名图片
NSString*imageName=[NSStringstringWithFormat:@"iOS%@.jpg",[selfstringFromDate:[NSDatedate]]];NSString*imagePath=[documentsDirectorystringByAppendingPathComponent:imageName];NSString*mediaType=[infoobjectForKey:UIImagePickerControllerMediaType];UIImage*image=[infoobjectForKey:UIImagePickerControllerOriginalImage];NSIntegeruserid=[[NSStringstringWithFormat:@"%@",[[NSUserDefaultsstandardUserDefaults]objectForKey:@"userID"]]integerValue];NSString*url=[NSStringstringWithFormat:@"http://pic.baikemy.net/apps/kanghubang/%@/%@/%@",[NSStringstringWithFormat:@"%ld",userid%1000],[NSStringstringWithFormat:@"%ld",(long)userid],imageName];NSString*script=[NSStringstringWithFormat:@"window.insertImage('%@','%@')",url,imagePath];NSDictionary*dic=@{@"url":url,@"image":image,@"name":imageName};
[_imageArraddObject:dic];//全局数组用于保存加上的图片
[self.webViewstringByEvaluatingJavaScriptFromString:script];
编辑完成后拿出html代码

1
NSString*html=[self.webViewstringByEvaluatingJavaScriptFromString:@"document.getElementById('content').innerHTML"];
编辑服务器中的富文本

1
2
NSString*place=[NSStringstringWithFormat:@"window.placeHTMLToEditor('%@')",self.inHtmlString];
[webViewstringByEvaluatingJavaScriptFromString:place];
5.与服务端对接
此时我们取出的富文本如下:

1
企鹅的时候要[站外图片上传中……(4)]<div>阿空间里发红包啦?我</div>[站外图片上传中……(5)]<div><br></div>
其中id部分为我处理的特殊部分
处理方法如下

1
2
3
4
5
6
7
8
9
10
-(NSString*)changeString:(NSString*)str
{
NSMutableArray*marr=[NSMutableArrayarrayWithArray:[strcomponentsSeparatedByString:@"\""]];for(inti=0;i<marr.count;i++)
{NSString*subStr=marr[i];if([subStrhasPrefix:@"/var"]||[subStrhasPrefix:@"id="])
{
[marrremoveObject:subStr];
i--;
}
}NSString*newStr=[marrcomponentsJoinedByString:@"\""];returnnewStr;
}
至此可实现一个富文本编辑器的新增与编辑.

Demo

原文:http://bbs.520it.com/forum.php?mod=viewthread&tid=2908&page=&extra=#pid32014
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: