iOS 사진 편집 - 낙서 - 손가락 이동 에 따라 마음대로 선 그리 기

7543 단어 ios그림.낙서
iOS 낙서. 직선 과 화살 표를 그 리 는 라인 에 대해 서 말씀 드 렸 잖 아 요.
참고:http://blog.csdn.net/lwjok2007/article/details/50885376
이 절 에서 우 리 는 손가락 이 어디로 이동 하 는 지 마음대로 그 려 보 자. 아래 그림 과 같다.
iOS 图片编辑——涂鸦——随手指移动随意画线_第1张图片
Xcode 를 사용 하여 프로젝트 를 만 듭 니 다. 이름: TestFingerLine (자세 한 생 성 방법 참조  http://blog.csdn.net/lwjok2007/article/details/50865598)
우선 우 리 는 두 가지 유형 을 추상적으로 추정한다.
1. 한 UIView 는 손가락 미끄럼 사건 을 전담 하여 낙서 를 표시 합 니 다. 
2. 한 가지 유형 은 선분 정 보 를 저장 하 는 데 사용 된다. (우 리 는 낙서 를 직선 으로 구 성 된 도형 으로 이해 할 수 있다. 손가락 을 조금 옮 길 때마다 직선 이 고 전체 낙서 는 사실은 매우 짧 은 선분 으로 구성 된다) 구체 적 으로 우 리 는 코드 를 통 해 이해 할 수 있다.
첫 번 째 클래스 이름: FingerDrawLine  (UIView 계승)
두 번 째 클래스 이름: FingerDrawLine Info (NSObject 계승)
만 든 다음 그림
iOS 图片编辑——涂鸦——随手指移动随意画线_第2张图片
일단 핑 거 드 로 라인 인 포 를 실현 해 보도 록 하 겠 습 니 다. 
#import <UIKit/UIKit.h>

@interface FingerDrawLineInfo : NSObject

@property (nonatomic,strong)NSMutableArray <__kindof NSValue *>*linePoints;//         
@property (nonatomic,strong)UIColor *lineColor;//     
@property (nonatomic)float lineWidth;//     

@end
#import "FingerDrawLineInfo.h"

@implementation FingerDrawLineInfo

- (instancetype)init {
    if (self=[super init]) {
        self.linePoints = [[NSMutableArray alloc] initWithCapacity:10];
    }
    
    return self;
}

@end

이제 FingerDrawLine Info 를 실현 하 겠 습 니 다.
#import <UIKit/UIKit.h>
#import "FingerDrawLineInfo.h"

@interface FingerDrawLine : UIView

//       ,     ,        @see DrawPaletteLineInfo
@property(nonatomic,strong) NSMutableArray  *allMyDrawPaletteLineInfos;
//              ,      VC      、                  
@property (nonatomic,strong)UIColor *currentPaintBrushColor;
@property (nonatomic)float currentPaintBrushWidth;

//               
- (void)cleanAllDrawBySelf;//    
- (void)cleanFinallyDraw;//       

@end
#import "FingerDrawLine.h"

@implementation FingerDrawLine


#pragma mark - init
- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        _allMyDrawPaletteLineInfos = [[NSMutableArray alloc] initWithCapacity:10];
        self.currentPaintBrushColor = [UIColor blackColor];
        self.backgroundColor = [UIColor clearColor];
        self.currentPaintBrushWidth =  4.f;
    }
    return self;
    
}


#pragma  mark - draw event
//               
- (void)drawRect:(CGRect)rect  {
    
    CGContextRef context=UIGraphicsGetCurrentContext();
    CGContextSetLineCap(context, kCGLineCapRound);
    CGContextSetLineJoin(context, kCGLineJoinRound);
    
    if (_allMyDrawPaletteLineInfos.count>0) {
        for (int i=0; i<[self.allMyDrawPaletteLineInfos count]; i++) {
            FingerDrawLineInfo *info = self.allMyDrawPaletteLineInfos[i];
            
            CGContextBeginPath(context);
            CGPoint myStartPoint=[[info.linePoints objectAtIndex:0] CGPointValue];
            CGContextMoveToPoint(context, myStartPoint.x, myStartPoint.y);
            
            if (info.linePoints.count>1) {
                for (int j=0; j<[info.linePoints count]-1; j++) {
                    CGPoint myEndPoint=[[info.linePoints objectAtIndex:j+1] CGPointValue];
                    CGContextAddLineToPoint(context, myEndPoint.x,myEndPoint.y);
                }
            }else {
                CGContextAddLineToPoint(context, myStartPoint.x,myStartPoint.y);
            }
            CGContextSetStrokeColorWithColor(context, info.lineColor.CGColor);
            CGContextSetLineWidth(context, info.lineWidth+1);
            CGContextStrokePath(context);
        }
    }
}


#pragma mark - touch event
//    
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    
    UITouch* touch=[touches anyObject];
    
    [self drawPaletteTouchesBeganWithWidth:self.currentPaintBrushWidth andColor:self.currentPaintBrushColor andBeginPoint:[touch locationInView:self ]];
    [self setNeedsDisplay];
}
//    
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    NSArray* MovePointArray=[touches allObjects];
    [self drawPaletteTouchesMovedWithPonit:[[MovePointArray objectAtIndex:0] locationInView:self]];
    [self setNeedsDisplay];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    
}


#pragma mark draw info edite event
//                      
- (void)drawPaletteTouchesBeganWithWidth:(float)width andColor:(UIColor *)color andBeginPoint:(CGPoint)bPoint {
    FingerDrawLineInfo *info = [FingerDrawLineInfo new];
    info.lineColor = color;
    info.lineWidth = width;
    
    [info.linePoints addObject:[NSValue valueWithCGPoint:bPoint]];
    
    [self.allMyDrawPaletteLineInfos addObject:info];
}

//                      point           
- (void)drawPaletteTouchesMovedWithPonit:(CGPoint)mPoint {
    FingerDrawLineInfo *lastInfo = [self.allMyDrawPaletteLineInfos lastObject];
    [lastInfo.linePoints addObject:[NSValue valueWithCGPoint:mPoint]];
}

- (void)cleanAllDrawBySelf {
    if ([self.allMyDrawPaletteLineInfos count]>0)  {
        [self.allMyDrawPaletteLineInfos removeAllObjects];
        [self setNeedsDisplay];
    }
}

- (void)cleanFinallyDraw {
    if ([self.allMyDrawPaletteLineInfos count]>0) {
        [self.allMyDrawPaletteLineInfos  removeLastObject];
    }
    [self setNeedsDisplay];
}

이제 뷰 컨트롤 러 에 ImageView 를 추가 해 보도 록 하 겠 습 니 다.
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    imageV = [[UIImageView alloc]initWithFrame:CGRectMake(0, 120, screen_Width, screen_Height-150)];
    imageV.image = [UIImage imageNamed:@"640-960-1.jpg"];
    [self.view addSubview:imageV];
    
    UIButton *testBtn = [[UIButton alloc]initWithFrame:CGRectMake(screen_Width/2.0-60, 60, 120, 36)];
    [testBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [testBtn setTitle:@"    " forState:UIControlStateNormal];
    [testBtn addTarget:self action:@selector(addLineAct:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:testBtn];
    
}

- (void)addLineAct:(id)sender{
    NSLog(@"    ");
    
    
    FingerDrawLine *touchdrawView = [[FingerDrawLine alloc]initWithFrame:imageV.frame];
    
    touchdrawView.currentPaintBrushColor = [UIColor yellowColor];
    touchdrawView.currentPaintBrushWidth = 5.0;
    [self.view addSubview:touchdrawView];
    
    
}

자, 프로젝트 를 실행 해 보 겠 습 니 다.
클릭 하여 낙서 추가 
그림 에 한번 그 려 볼 게 요. 나 왔 나 봐 요.
자, 이 코드 에 서 는 취소 와 낙서 를 지우 지 않 았 습 니 다. 하지만 방법 은 이미 다 썼 습 니 다. 여러분 이 직접 쓰 는 것 에 관심 이 있 습 니 다.
다음 절 에 우 리 는 그림 에 문 자 를 추가 하 는 것 을 이야기 합 시다. http://blog.csdn.net/lwjok2007/article/details/50896455
소스 코드 는 그룹 공간 에 업로드 합 니 다.
demo: [60314 손가락 낙서 FingerLine. zip]
애플 개발 군: 414319235 가입 을 환영 합 니 다.

좋은 웹페이지 즐겨찾기