iOS开发-高级UI-小应用画画板

画画板
1.搭建界面(3个按钮,1个View)

2.为重写touchesBegan:等方法,需要自定义一个View,新建一个View,名为NJView,然后在故事板将这个View的Class设置为NJView

3.在NJView.m中重写方法

//开始触摸
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//1.获取手指对应UITouch对象
UITouch *touch = [touches anyObject];
//2.通过UITouch对象获取手指触摸的位置
CGPoint startPoint = [touch locationInView:touch.view];
//3.创建一个小数组,用于保存当前路径所有的点
NSMutableArray *subPoints = [NSMutableArray array];
//4.将手指触摸的起点存储到小数组中
[subPoints addObejct:[NSValue valueWithCGPoint:startPoint]];
//5.将小数组存储到大数组中
[self.totalPoints   addObejct:subPoints];
}
//移动
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
//1.获取手指对应UITouch对象
UITouch *touch = [touches anyObject];
//2.通过UITouch对象获取手指触摸的位置
CGPoint movePoint = [touch locationInView:touch.view];

//3.从大数组中取出当前路径对应的小数组
NSMutableArray *subPoints = [self.totalPoints lastObject];
//4.将手指移动时触摸的点存储到小数组中
[subPoints addObejct:[NSValue valueWithCGPoint:movePoint]];
//5.调用drawRect:方法重绘视图
[self  setNeedsDisplay];
}
//离开view(停止触摸)
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
//1.获取手指对应UITouch对象
UITouch *touch = [touches anyObject];
//2.通过UITouch对象获取手指触摸的位置
CGPoint endPoint = [touch locationInView:touch.view];
//3.从大数组中取出当前路径对应的小数组
NSMutableArray *subPoints = [self.totalPoints lastObject];
//4.将手指离开时触摸的点存储到小数组中
[subPoints addObejct:[NSValue valueWithCGPoint:endPoint]];
//5.调用drawRect:方法重绘视图
[self setNeedsDisplay];
}

//画线
//上述几个方法获取的点不能直接在下面的方法用,在类扩展中声明一个数组用来装这些点,然后再取出来用
定义一个大数组(大数组中保存小数组,每一个小数组保存一条直线所有的点)
@property (nonatomic,strong)NSMutableArray *totalPoints;
- (NSMutableArray *)totalPoints
{
       if(_totalPoints == nil){
       _totalPoints = [NSMutableArray array];
 }
return _totalPoints;
}
-(void)drawRect:(CGRect)rect
{
//1.获取上下文
CGContextRef ctx = UIGraphicsGetCurrentContext();
//遍历大数组,取出所有的小数组(每个小数组代表一条线段)
for (NSMutableArray *subPointArray in self.totalPoints){
//遍历小数组,取出小数组中所有的点
     for (int index = 0;index < subPointArray.count;index++){
       //1.取出小数组中的每一个点
      CGPoint *point = self.points[index] CGPointValue];
      //2.绘制线段
       if (0 == index){
       //2.1.设置线段的起点
       CGContextMoveToPoint = (ctx,point.x,point.y);
    }  else
    {
//2.2. 设置线段的终点
CGContextAddLineToPoint(ctx,point.x,point.y);
      }
   }
}

for (int index = 0;index < self.points.count;index++){
CGPoint *point = self.points[index] CGPointValue];
//2.绘制线段
if (0 == index){
    //2.1.设置线段的起点
    CGContextMoveToPoint = (ctx,point.x,point.y);
}else
   {
    //2.2. 设置线段的终点
CGContextAddLineToPoint(ctx,point.x,point.y);
   }
}
CGContextSetLineCap(ctx,kCGLineCapRound);
CGContextSetLineJoin(ctx,kCGLineJoinRound);
CGContextSetLineWidth(ctx,10);
//3.渲染
CGContextStrokePath(ctx);
}

4.监听清屏按钮,回退按钮和保存按钮,并监听View属性(控制器头文件)
5.在NJView.h里提供方法(面向对象思想,控制器只负责调用)
-(void)clearView;
-(void)backView;
6.在NJView.m里实现方法
-(void)clearView
{
[self.totalPoints removeAllObjects];
[self setNeedsDisplay];
}
-(void)backView
{
[self.totalPoints removeLastObjects];
[self setNeedsDisplay];
}
7.在控制器实现文件中实现方法
-(IBAction)clearBtnClick{
[self.customView clearView];
}

-(IBAction)backBtnClick {
[self.customView backView];
}

-(IBAction)saveBtnClick {

UIImage *newimage = [UIImage captureImageWithView:self.customView];

//保存图片到相册
UIImageWriteToSavedPhotosAlbum(newImage,self,@selector(image:didFinishSavingWithError:contextInfo:), nil);

}

-(void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo

{
    if (error){
     [MBProgressHUD showError:@"保存失败,请检测应用是否拥有访问相册的权限"];
} else {
[MBProgressHUD showSuccess:@"保存成功"];
    }
}

8.新建一个类,为CaptureView
(用来截图,这样只需要把需要截图的View传进来即可)
在CaptureView.h中
+(UIImage *)captureImageWithView:(UIView *)view;
在CaptureView.m中
+(UIImage *)captureImageWithView:(UIView *)view
{
// 1.创建一个bitmap的上下文
UIGraphicsBeginImageContext(view.frame.size);
//2.将要保存的view的layer绘制到bitmap上下文中
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
//3.取出绘制好的图片
UIImage   *newImage = UIGraphicsGetImageFromCurrentImageContext();
return newImage;
}
PS:以后截屏只需导入这个类,然后调用captureImageWithView:方法即可。像这样经常用的代码,封装起来以后会很轻松。

时间: 2024-11-08 14:01:17

iOS开发-高级UI-小应用画画板的相关文章

iOS开发——高级UI&amp;带你玩转UITableView

带你玩装UITableView 在实际iOS开发中UITableView是使用最多,也是最重要的一个控件,如果你不会用它,那别说什么大神了,菜鸟都不如. 其实关于UItableView事非常简单的,实际开发中用起来却没有那么简单就是因为他结合MVC使用,涉及到了模型数据的读取,自定义View,功能的拓展和更好的解藕,下面就带你玩一遍: UITableView的两种样式 UITableViewStylePlain UITableViewStyleGroupeds accessoryType UIT

iOS开发——高级UI—OC篇&amp;退出键盘

退出键盘 iOS开发中键盘的退出方法用很多中我们应该在合适的地方使用合适的方法才能更好的提高开发的效率和应用的性能 下面给大家介绍几种最常用的键盘退出方法,基本上iOS开发中的键盘退出方法都是这几种中的一种活着几种. 一:textView 1 //通过委托来实现放弃第一响应者 2 #pragma mark - UITextView Delegate Method 3 -(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(N

iOS开发——高级UI之OC篇&amp;UIdatePicker&amp;UIPickerView简单使用

UIdatePicker&UIPickerView简单使用 /***********************************************************************************/ 一:UIdatePicker:(日期控件) 1.UIDatePicker什么时候用? 当用户选择日期的时候,一般弹出一个UIDatePicker给用户选择. 2.UIDatePickerios6和ios7/8的区别 下面看看使用封装的代码怎么去实现它: 因为这个比较简

iOS开发——高级技术精选OC篇&amp;Runtime之字典转模型实战

Runtime之字典转模型实战 如果您还不知道什么是runtime,那么请先看看这几篇文章: http://www.cnblogs.com/iCocos/p/4734687.html http://www.cnblogs.com/iCocos/p/4676679.html http://www.cnblogs.com/iCocos/p/4725527.html 关于runtime的详细介绍及其相关的小实例 好了,这里就不多废话了,直接开干! 先来看看怎么使用Runtime给模型类赋值 iOS开发

Android小应用-----画画板

public class MainActivity extends Activity { private ImageView iv; float startX = 0; float startY = 0; //获得一个可以被bitmap Bitmap bitmap = Bitmap.createBitmap(400, 400,Bitmap.Config.ARGB_8888); //创建画布 Canvas canvas = new Canvas(bitmap); //创建画笔 Paint pain

知识点回顾-27个iOS开发中的小技巧

★27个iOS开发中的小技巧 1.不想让TableView显示无用的Cell分割线怎么办? self.tableView.tableFooterView = [[UIView alloc] init]; 2.自定义了leftBarbuttonItem左滑返回手势失效了怎么办? self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:img style:UIBarButtonItemStylePl

IOS开发-UI学习-sqlite数据库的操作

IOS开发-UI学习-sqlite数据库的操作 sqlite是一个轻量级的数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了,而且它的处理速度比Mysql.PostgreSQL这两款著名的数据库都还快,在ios和安卓app中常用来完成对数据进行离线缓存的处理,如新闻数据的离线缓存. 它的基本操作步骤是: 1.先加入sqlite开发库libsqlite3.dylib, 2.新建或打开数据库, 3.创建数据表, 4.插入数据, 5.查询数据并打印, 6.关闭数据库, 具体操作步

IOS开发用户界面UI编程视频教程

在这个拼颜值的时代,App必须要华丽丽的闪亮登场,IOS UI设计成为iOS开发中必须熟练掌握的内容,可以说iOS开发的70%以上的工作量都花在iOS UI界面上,该阶段内容包括:iOS项目程序结构.生命周期.事件周期.视图View.各种视图组件.各种视图控制器.动画等. IOS开发用户界面UI编程视频教程(某学堂出品)课程目录:01-第一个UI程序02-视图创建03-父子视图04-UILabel标签05-Frame与bounds的区别06-UIButton按钮的使用07-UIImageView

(素材源码)猫猫学IOS(三十四)UI之Quartz2D画画板的实现

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents 源码:http://download.csdn.net/detail/u013357243/8666923 效果: 代码: NYView NYView.h // // NYView.h // 画画板 // // Created by apple on 15-5-6. // Copyright (c) 2015年 znycat.