iOS 사진 편집 - 낙서 - 손가락 이동 에 따라 마음대로 선 그리 기
참고:http://blog.csdn.net/lwjok2007/article/details/50885376
이 절 에서 우 리 는 손가락 이 어디로 이동 하 는 지 마음대로 그 려 보 자. 아래 그림 과 같다.
Xcode 를 사용 하여 프로젝트 를 만 듭 니 다. 이름: TestFingerLine (자세 한 생 성 방법 참조 http://blog.csdn.net/lwjok2007/article/details/50865598)
우선 우 리 는 두 가지 유형 을 추상적으로 추정한다.
1. 한 UIView 는 손가락 미끄럼 사건 을 전담 하여 낙서 를 표시 합 니 다.
2. 한 가지 유형 은 선분 정 보 를 저장 하 는 데 사용 된다. (우 리 는 낙서 를 직선 으로 구 성 된 도형 으로 이해 할 수 있다. 손가락 을 조금 옮 길 때마다 직선 이 고 전체 낙서 는 사실은 매우 짧 은 선분 으로 구성 된다) 구체 적 으로 우 리 는 코드 를 통 해 이해 할 수 있다.
첫 번 째 클래스 이름: FingerDrawLine (UIView 계승)
두 번 째 클래스 이름: FingerDrawLine Info (NSObject 계승)
만 든 다음 그림
일단 핑 거 드 로 라인 인 포 를 실현 해 보도 록 하 겠 습 니 다.
#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 가입 을 환영 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Swift의 패스트 패스Objective-C를 대체하기 위해 만들어졌지만 Xcode는 Objective-C 런타임 라이브러리를 사용하기 때문에 Swift와 함께 C, C++ 및 Objective-C를 컴파일할 수 있습니다. Xcode는 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.