在UIImageView上绘制UIBezierPath以进行图像裁剪

时间:2015-09-12 22:05:58

标签: ios objective-c uiimageview uibezierpath

我正在制作照片编辑应用程序,并且需要用户能够绘制裁剪照片的路径。我有一个与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上放置一个断点,它会在预期时触发。

1 个答案:

答案 0 :(得分:2)

第一个问题 - userInteractionEnabled属性应设置为YES以接收触摸事件。

第二个 - drawRect:子类没有调用UIImageView方法:

  

优化UIImageView类以将其图像绘制到显示器。   UIImageView不会调用drawRect:一个子类。如果您的子类需要   自定义绘图代码,建议您使用UIView作为基础   类。

因此,DrawView应该是UIView子类,它会在贝塞尔路径绘制之前在UIImage中绘制drawRect:。类似的东西(只改变了代码部分):

// 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