[英]Draw UIBezierPath on UIImageView for image crop
我正在使用照片编辑应用程序,需要用户能够绘制出裁剪照片的路径。 我有一个与UIView一起使用的类,用于绘制平滑的UIBezierPath线。 但是,我确实需要将此应用到UIImageView,以便可以在图像上进行绘制。 如果我将类更改为UIImageView的子类,它将不再起作用。 关于如何解决此问题的任何想法? 还是实现同一目标的更好选择? 下面是我的实现:
#import "DrawView.h"
@implementation DrawView
{
UIBezierPath *path;
}
- (id)initWithCoder:(NSCoder *)aDecoder // (1)
{
if (self = [super initWithCoder:aDecoder])
{
[self setMultipleTouchEnabled:NO]; // (2)
[self setBackgroundColor:[UIColor whiteColor]];
path = [UIBezierPath bezierPath];
[path setLineWidth:2.0];
}
return self;
}
- (void)drawRect:(CGRect)rect // (5)
{
[[UIColor blackColor] setStroke];
[path stroke];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
CGPoint p = [touch locationInView:self];
[path moveToPoint:p];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
CGPoint p = [touch locationInView:self];
[path addLineToPoint:p]; // (4)
[self setNeedsDisplay];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
[self touchesMoved:touches withEvent:event];
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
[self touchesEnded:touches withEvent:event];
}
@end
如果我在touchesBegan或touchesMoved上放置一个断点,则会在预期的时候触发。
第一个问题userInteractionEnabled
属性应设置为YES
以接收触摸事件。
第二个UIImageView
子类未调用drawRect:
方法:
UIImageView类经过优化,可以将其图像绘制到显示器上。 UIImageView不会调用drawRect:一个子类。 如果您的子类需要自定义绘图代码,则建议您使用UIView作为基类。
因此, DrawView
应该是UIView
子类,它将在绘制bezier路径之前在drawRect:
绘制UIImage
。 诸如此类(仅更改了部分代码):
// DrawView.h
@interface DrawView : UIView
@property (nonatomic, strong) UIImage* image;
@end
// DrawView.m
@implementation DrawView
- (void)drawRect:(CGRect)rect
{
[image drawInRect:self.bounds];
[[UIColor blackColor] setStroke];
[path stroke];
}
@end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.