繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM