1.图文混排编辑,图片可拖动,看动态图
:
2.看代码:
.h文件
//
// ViewController.h
// textView
//
// Created by yupeng xia on 16/9/19.
// Copyright © 2016年 yupeng xia. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end
.m文件
//
// ViewController.m
// textView
//
// Created by yupeng xia on 16/9/19.
// Copyright © 2016年 yupeng xia. All rights reserved.
//
#import "ViewController.h"
#import <MobileCoreServices/MobileCoreServices.h>
#import <AVFoundation/AVFoundation.h>
#import <MediaPlayer/MediaPlayer.h>
#import "UIImageViewBaseClass.h"
@interface ViewController ()<UIActionSheetDelegate, UINavigationControllerDelegate, UIImagePickerControllerDelegate>{
UITextView* textView;
UIButton* addImageButton;
NSRange _range;
NSMutableDictionary* jsonData;
NSMutableArray* imageArray;
NSMutableArray *pathArray;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
jsonData = [NSMutableDictionary dictionaryWithCapacity:0];
imageArray = [NSMutableArray arrayWithCapacity:0];
pathArray = [NSMutableArray arrayWithCapacity:0];
NSString * str1 = @"asfasfa阿斯顿发生大发撒放大离开家撒旦法按时付款就阿里;双方均asfasdfasfdalkjsflakj阿斯顿发生大发撒旦法asdfasdfaasfdaasa撒旦法;拉斯克奖发了奥斯卡奖罚洛杉矶的法律;看见谁发的阿斯利康就发;了数据库等法律按实际开发;阿里就开始放到了;安家费阿里山科技发达了开始将对方拉开始交电费了卡双方的空间啊发送卡飞机阿里开始就放暑假了罚款就是浪费asfasfa阿斯顿发生大发撒放大离开家撒旦法按时付款就阿里;双方均asfasdfasfdalkjsflakj阿斯顿发生大发撒旦法asdfasdfaasfdaasa撒旦法;拉斯克奖发了奥斯卡奖罚洛杉矶的法律;看见谁发的阿斯利康就发;了数据库等法律按实际开发;阿里就开始放到了;安家费阿里山科技发达了开始将对方拉开始交电费了卡双方的空间啊发送卡飞机阿里开始就放暑假了罚款就是浪费asfasfa阿斯顿发生大发撒放大离开家撒旦法按时付款就阿里;双方均asfasdfasfdalkjsflakj阿斯顿发生大发撒旦法asdfasdfaasfdaasa撒旦法;拉斯克奖发了奥斯卡奖罚洛杉矶的法律;看见谁发的阿斯利康就发;了数据库等法律按实际开发;阿里就开始放到了;安家费阿里山科技发达了开始将对方拉开始交电费了卡双方的空间啊发送卡飞机阿里开始就放暑假了罚款就是浪费";
self.edgesForExtendedLayout = UIRectEdgeNone;
//初始化编辑框
textView = [[UITextView alloc] initWithFrame:CGRectMake(0, 20, self.view.frame.size.width, self.view.frame.size.height - 20)];
textView.backgroundColor = [UIColor cyanColor];
textView.text = str1;
textView.font = [UIFont systemFontOfSize:15];
[self.view addSubview:textView];
// //设置环绕的路径
// UIBezierPath* path = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 100, 100)];
// UIBezierPath* path1 = [UIBezierPath bezierPathWithRect:CGRectMake(0, 200, 100, 100)];
// UIBezierPath* path2 = [UIBezierPath bezierPathWithRect:CGRectMake(0, 400, 100, 100)];
// textView.textContainer.exclusionPaths = @[path,path1,path2];
addImageButton = [UIButton buttonWithType:UIButtonTypeCustom];
addImageButton.layer.cornerRadius = 30;
addImageButton.titleLabel.font = [UIFont systemFontOfSize:50];
[addImageButton setTitle:@"+" forState:UIControlStateNormal];
[addImageButton setTitle:@"+" forState:UIControlStateHighlighted];
[addImageButton setBackgroundColor:[UIColor orangeColor]];
[addImageButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[addImageButton setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
[addImageButton setFrame:CGRectMake(self.view.frame.size.width-60-20, self.view.frame.size.height-60-20, 60, 60)];
[addImageButton addTarget:self action:@selector(addImageSelectAction:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:addImageButton];
}
#pragma mark <--------------添加图片-------------->
- (void)addImageSelectAction:(id)sender{
//定义图片选择器
UIImagePickerController * picker = [[UIImagePickerController alloc]init];
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"标题" message:@"这个是UIAlertController的默认样式" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *takePhotos = [UIAlertAction actionWithTitle:@"拍照" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
//图片选择是相册(图片来源自相册)
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
//设置代理
picker.delegate=self;
//模态显示界面
[self presentViewController:picker animated:YES completion:nil];
}else{
NSLog(@"不支持相机");
}
}];
UIAlertAction *photos = [UIAlertAction actionWithTitle:@"相册" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
//判断系统是否允许选择 相册
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
//图片选择是相册(图片来源自相册)
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
//设置代理
picker.delegate=self;
//模态显示界面
[self presentViewController:picker animated:YES completion:nil];
}
}];
[alertController addAction:takePhotos];//添加按钮
[alertController addAction:photos];//添加按钮
[self presentViewController:alertController animated:YES completion:nil];
}
#pragma mark <--------------UIImagePickerControllerDelegate-------------->
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
//通过key值获取到图片
UIImage * pickerImage =info[UIImagePickerControllerOriginalImage];
NSLog(@"image=%@ info=%@",pickerImage, info);
//判断数据源类型
switch (picker.sourceType) {
case UIImagePickerControllerSourceTypePhotoLibrary:{
// NSData* imgData = UIImageJPEGRepresentation(pickerImage, 1);
[self updateImageFrameImage:pickerImage imageType:0];
[self dismissViewControllerAnimated:YES completion:nil];
}
break;
case UIImagePickerControllerSourceTypeCamera:{
UIImageWriteToSavedPhotosAlbum(pickerImage, nil, nil, nil);
// NSData* imgData = UIImageJPEGRepresentation(pickerImage, 1);
[self updateImageFrameImage:pickerImage imageType:0];
[self dismissViewControllerAnimated:YES completion:nil];
}
break;
default:
break;
}
}
#pragma mark <--------------图片拖动处理-------------->
- (void)doHandlePanAction:(UIPanGestureRecognizer *)paramSender{
CGPoint point = [paramSender translationInView:textView];
NSLog(@"X:%f;Y:%f",point.x,point.y);
paramSender.view.center = CGPointMake(paramSender.view.center.x + point.x, paramSender.view.center.y + point.y);
UIImageViewBaseClass* aImageView = [imageArray objectAtIndex:paramSender.view.tag-101];
aImageView.imageFrame = CGRectMake(paramSender.view.center.x + point.x - aImageView.frame.size.width/2, paramSender.view.center.y + point.y - aImageView.frame.size.height/2, aImageView.imageFrame.size.width, aImageView.imageFrame.size.height);
[self updateImageFrameImage:paramSender imageType:1];
[paramSender setTranslation:CGPointMake(0, 0) inView:textView];
}
//aImageType:0 添加图片; aImageType:1 移动图片;
- (void)updateImageFrameImage:(id)sender imageType:(NSInteger)aImageType{
switch (aImageType) {//添加图片
case 0:{
UIImage *uploadImage = sender;
UIImageViewBaseClass* aImageView = [[UIImageViewBaseClass alloc] initWithFrame:CGRectMake(0, 0, 100.0f, uploadImage.size.height*(100.0f/uploadImage.size.width))];
aImageView.userInteractionEnabled = YES;
aImageView.image = uploadImage;
aImageView.imageFrame = aImageView.frame;
[textView addSubview:aImageView];
//存储图片
[imageArray addObject:aImageView];
//添加拖动手势
UIPanGestureRecognizer * panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self
action:@selector(doHandlePanAction:)];
[aImageView addGestureRecognizer:panGestureRecognizer];
panGestureRecognizer.view.tag = [imageArray indexOfObject:aImageView] + 101;
//存储图片path
UIBezierPath * path = [UIBezierPath bezierPathWithRect:aImageView.imageFrame];
[pathArray addObject:path];
}
break;
case 1:{//移动图片
UIPanGestureRecognizer * panGestureRecognizer = sender;
UIImageViewBaseClass* aImageView = [imageArray objectAtIndex:panGestureRecognizer.view.tag-101];
UIBezierPath * path = [UIBezierPath bezierPathWithRect:aImageView.imageFrame];
//跟新正在移动图片的path
[pathArray replaceObjectAtIndex:panGestureRecognizer.view.tag-101 withObject:path];
}
break;
default:
break;
}
textView.textContainer.exclusionPaths = pathArray;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
3.下载源码_demo