亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

IOS實現的簡單畫板功能

2020-07-26 02:51:50
字體:
來源:轉載
供稿:網友

效果圖

設計要求

 1、畫筆能設置大小、顏色

 2、有清屏、撤銷、橡皮擦、導入照片功能

 3、能將繪好的畫面保存到相冊

實現思路

1、畫筆的實現,我們可以通過監聽用戶的 平移手勢 中創建 UIBezierPath 來實現線條的繪制

2、撤銷功能,我們先來看下撤銷功能,我們會想到用一個數組隊列將用戶的每一次的筆畫都加入到數組中,然后撤銷的時候只需要將最后添加進去的筆畫pop掉,重新繪制就可以了

3、清屏功能就簡單了,只需要將上面說到的那個數組清空重新繪制下就可以了

4、導入照片功能,可以用系統的 UIImagePickerController 選取照片得到UIImage,然后再將 UIImage 繪制到屏幕中就可以了

5、保存到相冊功能,可以使用 UIGraphicsGetImageFromCurrentImageContext 獲取當前的圖片上下文,得到屏幕畫面的 UIImage ,然后通過 UIImageWriteToSavedPhotosAlbum 寫入到相冊

具體代碼實現

1、先畫個界面

2、因為我們繪制線條會用到 UIBezierPath ,并且要能可設置顏色,但是UIBezierPath是沒有設置顏色的屬性,所以我們這里需要簡單擴展一下,創建一個繼承于 UIBezierPath 的子類 DrawPath

//// DrawPath.h// 畫板//// Created by xgao on 16/4/13.// Copyright © 2016年 xgao. All rights reserved.//#import <UIKit/UIKit.h>@interface DrawPath : UIBezierPath// 畫筆顏色@property(nonatomic,retain)UIColor* pathColor;@end

這個子類只需要擴展一個屬性,就是 pathColor 用來保存畫筆的顏色

//// DrawPath.m// 畫板//// Created by xgao on 16/4/13.// Copyright © 2016年 xgao. All rights reserved.//#import "DrawPath.h"@implementation DrawPath@end

DrawPath.m 里面不需要做其它功能

3、接到來我們對畫板功能的實現封裝一下,創建一個繼承于UIView的 DrawView子類

//// DrawView.h// 畫板//// Created by xgao on 16/4/13.// Copyright © 2016年 xgao. All rights reserved.//#import <UIKit/UIKit.h>@interface DrawView : UIView// 畫線的寬度@property(nonatomic,assign)CGFloat lineWidth;// 線條顏色@property(nonatomic,retain)UIColor* pathColor;// 加載背景圖片@property(nonatomic,strong)UIImage* image;// 清屏- (void)clear;// 撤銷- (void)undo;// 橡皮擦- (void)eraser;// 保存- (void)save;@end
//// DrawView.m// 畫板//// Created by xgao on 16/4/13.// Copyright © 2016年 xgao. All rights reserved.//#import "DrawView.h"#import "DrawPath.h"@interface DrawView()@property(nonatomic,strong) DrawPath* path;// 線的數組@property(nonatomic,strong) NSMutableArray* paths;@end@implementation DrawView- (void)awakeFromNib{ [self setUp];}- (instancetype)initWithFrame:(CGRect)frame{ self = [super initWithFrame:frame]; if (self) { [self setUp]; } return self;}// 重繪UI- (void)drawRect:(CGRect)rect { for (DrawPath* path in self.paths) { if ([path isKindOfClass:[UIImage class]]) {  // 畫圖片  UIImage* image = (UIImage*)path;  [image drawInRect:rect]; }else{  // 畫線  // 設置畫筆顏色  [path.pathColor set];  // 繪制  [path stroke]; } }}// 懶加載屬性- (NSMutableArray*)paths{ if (_paths == nil) { _paths = [NSMutableArray array]; } return _paths;}// 重寫image屬性- (void)setImage:(UIImage *)image{ _image = image; // 將圖片加入到線條數組中 [self.paths addObject:image]; [self setNeedsDisplay];}#pragma mark - Init// 初始化- (void)setUp{ // 添加平移手勢 UIPanGestureRecognizer* panGes = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panGes:)]; [self addGestureRecognizer:panGes]; // 默認值 self.lineWidth = 1; self.pathColor = [UIColor blackColor];}#pragma mark - Event// 平移事件- (void)panGes:(UIPanGestureRecognizer*)ges{ // 獲取當前點 CGPoint curPoint = [ges locationInView:self]; if (ges.state == UIGestureRecognizerStateBegan) { // 開始移動 // 創建貝塞爾曲線 _path = [[DrawPath alloc]init]; // 設置線條寬度 _path.lineWidth = _lineWidth; // 線條默認顏色 _path.pathColor = _pathColor; // 設置起始點 [_path moveToPoint:curPoint]; [self.paths addObject:_path]; } // 連線 [_path addLineToPoint:curPoint]; // 重繪 [self setNeedsDisplay];}#pragma mark - Method// 清屏- (void)clear{ [self.paths removeAllObjects]; [self setNeedsDisplay];}// 撤銷- (void)undo{ [self.paths removeLastObject]; [self setNeedsDisplay];}// 橡皮擦- (void)eraser{ self.pathColor = [UIColor whiteColor]; [self setNeedsDisplay];}// 保存- (void)save{ // ---- 截圖操作 // 開啟上下文 UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, 0); // 獲取當前上下文 CGContextRef context = UIGraphicsGetCurrentContext(); // 渲染圖層到上下文 [self.layer renderInContext:context]; // 從上下文中獲取圖片 UIImage* image = UIGraphicsGetImageFromCurrentImageContext(); // 關閉上下文 UIGraphicsEndImageContext(); // ---- 保存圖片 UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);}// 圖片保存方法,必需寫這個方法體,不能會保存不了圖片- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{ // 提示 UIAlertView* alert = [[UIAlertView alloc]initWithTitle:@"保存成功" message:nil delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil, nil]; [alert show];}@end

4、接下來就是如果使用這個畫板類了,直接上代碼吧

//// ViewController.m// 畫板//// Created by xgao on 16/4/13.// Copyright © 2016年 xgao. All rights reserved.//#import "ViewController.h"#import "DrawView.h"@interface ViewController ()<UIImagePickerControllerDelegate,UINavigationControllerDelegate>// 畫板@property (weak, nonatomic) IBOutlet DrawView *drawView;@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad];}#pragma mark - Event// 線條寬度變化- (IBAction)lineWidthChange:(UISlider*)sender { _drawView.lineWidth = sender.value;}// 線條顏色變化- (IBAction)pathColorChange:(UIButton*)sender { _drawView.pathColor = sender.backgroundColor;}// 清屏- (IBAction)clearAction:(id)sender { [_drawView clear];}// 撤銷- (IBAction)undoAction:(id)sender { [_drawView undo];}// 橡皮擦- (IBAction)eraserAction:(id)sender { [_drawView eraser];}// 照片- (IBAction)pickerPhotoAction:(id)sender { // 照片選擇控制器 UIImagePickerController* picVC = [[UIImagePickerController alloc]init]; // 照片源 picVC.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; // 委托 picVC.delegate = self; [self presentViewController:picVC animated:YES completion:nil];}// 保存- (IBAction)saveAction:(id)sender { [_drawView save];}#pragma mark - UIImagePickerControllerDelegate- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(nullable NSDictionary<NSString *,id> *)editingInfo{ // 設置圖片 _drawView.image = image; // 關閉窗口 [self dismissViewControllerAnimated:YES completion:nil];}@end

到這里就差不多了,這個小功能實現的基本思路與具體代碼我都已經放上來了,大家如果還有哪里不清楚的可以留言喔~~

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持武林網!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
zzjj国产精品一区二区| 日韩在线高清视频| 亚洲高清在线观看| 日韩中文字幕在线免费观看| 久久综合久中文字幕青草| 亚洲精品久久久久| 亚洲二区中文字幕| 欧美特黄级在线| 久久精品这里热有精品| 97婷婷大伊香蕉精品视频| 国产精品久久久久久久久免费看| 亚洲第一偷拍网| 日韩经典第一页| 亚洲理论片在线观看| 欧美日韩亚洲一区二区| 欧美成人亚洲成人| 亚洲第一精品久久忘忧草社区| 日韩一区av在线| 欧美激情亚洲另类| 77777亚洲午夜久久多人| 在线视频欧美性高潮| 欧美亚洲另类制服自拍| 欧美成人免费一级人片100| 国产精品678| 色婷婷久久一区二区| 韩国美女主播一区| 国产成人涩涩涩视频在线观看| 日韩精品在线观看一区二区| 欧美一级淫片videoshd| 日韩电影免费观看在线| 国产精品福利观看| 欧美日韩国产一区二区| 欧美裸体xxxx极品少妇软件| 国产精品青青在线观看爽香蕉| 国产精品露脸自拍| 亚洲精品成人久久电影| 亚洲精品日韩av| 亚洲va久久久噜噜噜| 欧美日韩亚洲精品内裤| 亚洲欧美精品suv| 98精品在线视频| 亚洲欧美制服第一页| 成人中文字幕在线观看| 97涩涩爰在线观看亚洲| 26uuu另类亚洲欧美日本一| 亚洲欧美国产制服动漫| 欧美日韩第一视频| 亚洲区一区二区| 欧美日韩国产一区中文午夜| 在线观看精品国产视频| 日韩中文字幕视频在线观看| 欧美激情精品久久久久久变态| 成人亚洲激情网| 亚洲精品99久久久久中文字幕| 国内揄拍国内精品| 免费av一区二区| 日韩三级成人av网| 欧美在线一区二区三区四| 国产日韩欧美夫妻视频在线观看| 欧美高清自拍一区| 日韩一二三在线视频播| 日本欧美中文字幕| 色婷婷综合久久久久| 亚洲一区二区三区久久| 亚洲字幕在线观看| 浅井舞香一区二区| 精品久久久国产| 亚洲韩国欧洲国产日产av| 久久久久久亚洲精品中文字幕| 国产精品视频99| 自拍视频国产精品| 欧美成人国产va精品日本一级| 欧美激情精品久久久久久黑人| 法国裸体一区二区| 日韩中文字幕在线精品| 欧美性69xxxx肥| 亚洲欧美日韩久久久久久| 97**国产露脸精品国产| 精品福利视频导航| 午夜精品一区二区三区在线播放| 亚洲美女性视频| 国语对白做受69| 97久久超碰福利国产精品…| 亚洲国产另类久久精品| 亚洲影院高清在线| 亚洲小视频在线观看| 国产精品视频yy9099| 91精品国产高清久久久久久久久| 欧美色videos| 国产精品久久久久999| 国产91热爆ts人妖在线| 国产成人精品国内自产拍免费看| 欧美极品少妇xxxxⅹ裸体艺术| 欧美噜噜久久久xxx| 91视频88av| 亚洲网址你懂得| 成人一区二区电影| 欧美最猛黑人xxxx黑人猛叫黄| 夜夜躁日日躁狠狠久久88av| 欧美日韩亚洲视频| 欧美最猛性xxxxx免费| 亚洲亚裔videos黑人hd| 亚洲欧美中文字幕在线一区| 日韩电影网在线| 日韩精品高清在线观看| 精品国产区一区二区三区在线观看| 欧美日产国产成人免费图片| 国产精品久久久久久久久影视| 亚洲图片在区色| 91亚洲一区精品| 91嫩草在线视频| 国产亚洲精品美女| 国产精品日本精品| 欧美日韩国产中文字幕| 日韩中文娱乐网| 国内精品视频一区| 伊人久久久久久久久久| 草民午夜欧美限制a级福利片| 精品一区二区三区四区| 国产999精品久久久影片官网| 欧美一性一乱一交一视频| 日韩成人激情影院| 黑人欧美xxxx| 欧美乱大交xxxxx| 久操成人在线视频| 91亚洲一区精品| 91免费人成网站在线观看18| 亚洲视频在线观看免费| 国产成人激情视频| 欧美在线亚洲在线| 国产精品久久久久久久午夜| 亚洲精品乱码久久久久久按摩观| 日韩免费精品视频| 免费不卡欧美自拍视频| 日韩电影网在线| 欧美性做爰毛片| 国产日韩欧美在线| 欧美专区在线观看| 91国产美女在线观看| 精品视频在线导航| 日韩中文字幕亚洲| 国产福利视频一区二区| 欧美亚洲国产日韩2020| 欧美国产日韩一区二区在线观看| 91精品国产色综合| 欧美日韩亚洲视频| 国产成人在线一区| 亚洲美女性视频| 亚洲成人网av| 日韩电影视频免费| 欧美性xxxx在线播放| 国产精品成人免费视频| 亚洲最新av在线网站| 亚洲成人教育av| 国产精品一区久久久| 精品无人区乱码1区2区3区在线| 91热福利电影| 插插插亚洲综合网| 国产在线a不卡| 亚洲有声小说3d| 久久久国产视频| 国产精品精品国产| 久久免费观看视频| 精品久久久久久中文字幕大豆网|