IOS簡單畫板實現,ios畫板

來源:互聯網
上載者:User

IOS簡單畫板實現,ios畫板

 

 

 設計要求

 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

 

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

 

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.