Tôi có vấn đề để triển khai "Hiệu ứng đổ bóng/đổ bóng" trong bản vẽ của tôi. chức năng sơn ngón tay hiện đang làm việc tốt với tùy chỉnh của tôi UIView
và dưới đây là mã drawRect
phương pháp của tôi:Cách tạo hiệu ứng nổi hoặc bóng bằng cách sử dụng Đồ họa lõi (để vẽ bằng ngón tay)
Chỉnh sửa mã với tất cả các phương pháp:
- (void)drawRect:(CGRect)rect
{
CGPoint mid1 = midPoint(previousPoint1, previousPoint2);
CGPoint mid2 = midPoint(currentPoint, previousPoint1);
CGContextRef context = UIGraphicsGetCurrentContext();
[self.layer renderInContext:context];
CGContextMoveToPoint(context, mid1.x, mid1.y);
CGContextAddQuadCurveToPoint(context, previousPoint1.x, previousPoint1.y, mid2.x, mid2.y);
CGContextSetLineCap(context, kCGLineCapRound);
CGContextSetLineWidth(context, self.lineWidth);
CGContextSetStrokeColorWithColor(context, self.lineColor.CGColor);
CGContextSaveGState(context);
// for shadow effects
CGContextSetShadowWithColor(context, CGSizeMake(0, 2),3, self.lineColor.CGColor);
CGContextStrokePath(context);
[super drawRect:rect];
}
CGPoint midPoint(CGPoint p1, CGPoint p2)
{
return CGPointMake((p1.x + p2.x) * 0.5, (p1.y + p2.y) * 0.5);
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
previousPoint1 = [touch previousLocationInView:self];
previousPoint2 = [touch previousLocationInView:self];
currentPoint = [touch locationInView:self];
[self touchesMoved:touches withEvent:event];
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
previousPoint2 = previousPoint1;
previousPoint1 = [touch previousLocationInView:self];
currentPoint = [touch locationInView:self];
// calculate mid point
CGPoint mid1 = midPoint(previousPoint1, previousPoint2);
CGPoint mid2 = midPoint(currentPoint, previousPoint1);
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, mid1.x, mid1.y);
CGPathAddQuadCurveToPoint(path, NULL, previousPoint1.x, previousPoint1.y, mid2.x, mid2.y);
CGRect bounds = CGPathGetBoundingBox(path);
CGPathRelease(path);
CGRect drawBox = bounds;
//Pad our values so the bounding box respects our line width
drawBox.origin.x -= self.lineWidth * 2;
drawBox.origin.y -= self.lineWidth * 2;
drawBox.size.width += self.lineWidth * 4;
drawBox.size.height += self.lineWidth * 4;
UIGraphicsBeginImageContext(drawBox.size);
[self.layer renderInContext:UIGraphicsGetCurrentContext()];
curImage = UIGraphicsGetImageFromCurrentImageContext();
[curImage retain];
UIGraphicsEndImageContext();
[self setNeedsDisplayInRect:drawBox];
}
khi tôi đã thực hiện điều này tôi đang nhận được hiệu ứng sơn với dấu chấm dot dot ...
Xem hình ảnh bên dưới (không có bất kỳ hiệu ứng đổ bóng hoặc dập nổi nào). Nếu bạn có bất kỳ ý tưởng làm thế nào để thêm các hiệu ứng này, xin vui lòng cho tôi một số gợi ý. Làm thế nào tôi có thể giải quyết điều này?
tôi đánh giá cao đề xuất của bạn. tôi đã sử dụng UIBezierPath và thực hiện nó nhưng chúng tôi phải đối mặt với một số vấn đề như xóa chức năng và chọn màu sắc khác nhau của sơn .. vì vậy cuối cùng tất cả tôi đã thay đổi chức năng và sử dụng CGContext. Bây giờ tất cả các chức năng như Erase, thay đổi màu sắc của bàn chải đang làm việc tốt. Phát hành chỉ là để tạo ra hiệu ứng Emboss hoặc bóng tối. mà hiệu ứng không hoạt động đúng cách .. straigh dòng làm việc tốt với hiệu ứng bóng. nhưng hiệu ứng đường cong (mịn) không làm việc tốt. plz cho tôi biết một số suggeetion bằng cách sử dụng CGContext. – Hitarth
Câu hỏi nhanh: Bạn muốn Erase hoạt động như thế nào? Hầu hết các chương trình 'vẽ' sẽ xóa từng 'đường dẫn' riêng biệt (như được định nghĩa là sự kiện chạm/kéo/kết thúc bằng một ngón tay). Điều này làm việc với đề xuất/câu trả lời của tôi. Tuy nhiên, nếu bạn đang cố gắng xóa từng điểm của đường dẫn hoặc thậm chí mỗi pixel .... sẽ khó thực hiện hơn nhiều. –
i m xoá bằng ngữ cảnh hiện tại. và nó hoạt động tốt. – Hitarth