2015-09-12 83 views
0

我正在研究一個照片編輯應用程序,並且需要用戶能夠繪製出裁剪照片的路徑。我有一個類與UIView一起工作,用於繪製流暢的UIBezierPath行。不過,我真的需要將它應用於UIImageView,以便可以在圖像上完成繪圖。如果我將該類更改爲UIImageView的子類,則不再有效。任何想法,我可以做些什麼來解決這個問題?或者更好的選擇來實現相同的目標?下面是我的實現:在UIImageView上爲圖像裁剪畫UIBezierPath

#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預期當它火。

回答

2

第一個問題 - userInteractionEnabled屬性應設置爲YES用於接收觸摸事件。

第二個 - drawRect:方法不要求UIImageView子類:

UIImageView類被優化以繪製其圖像的顯示。 UIImageView不會調用drawRect:一個子類。如果您的子類需要 自定義繪圖代碼,建議您使用UIView作爲基類 類。

所以,DrawViewUIView子類,將在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 
+0

好吧,我也有和無userInteractionEnabled試了一下,就像我說的,即使沒有它,我仍然得到的touchesBegan火。不過,您的其他解決方案可能是我需要的。你能否更深入地解釋你的解決方案?謝謝您的回覆! –

+0

這是行不通的,但是由於對[self setNeedsDisplay]的調用,它運行速度很慢;在後臺重新繪製圖像。沒有刷新圖像刷新繪圖嗎? –

+0

作爲替代解決方案,您可以嘗試將DrawView放在Interface Builder中的UIImageView上。在這種情況下,您不應該在DrawView中繪製圖像。然後,UIImageView將繪製圖像,而DrawView將只繪製更加卑鄙的路徑。此外,您可以使用 - [self setNeedsDisplayInRect:path.bounds]來最小化要重繪的區域。 –