1

我正在使用以下代码UIBezierPath在 aUIImageView中绘制 a UIView。但它没有显示绿色路径。

- (void)drawRect:(CGRect)rect
{
    [[UIColor blackColor] setStroke];
    [aPath strokeWithBlendMode:kCGBlendModeNormal alpha:1.0];
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{    
    UITouch *mytouch=[[touches allObjects] objectAtIndex:0];
    self->aPath = [[UIBezierPath alloc]init];

    CAShapeLayer* greenPath = [CAShapeLayer layer];
    greenPath.path = aPath.CGPath;
    [greenPath setFillColor:[UIColor greenColor].CGColor];
    [greenPath setStrokeColor:[UIColor blueColor].CGColor];
    greenPath.frame=CGRectMake(0, 0,100,30);

    //add shape layer to view's layer
    [[imgView layer] addSublayer:greenPath];

    aPath.lineCapStyle=kCGLineCapRound;
    aPath.miterLimit=0;
    aPath.lineWidth=10;

    [aPath moveToPoint:[mytouch locationInView:imgView]];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *mytouch=[[touches allObjects] objectAtIndex:0];
    [aPath addLineToPoint:[mytouch locationInView:imgView]];
    [imgView setNeedsDisplay];
}

我需要在UIBezierPath绘制的任何地方显示一条绿线。

4

1 回答 1

1

你的代码中有很多奇怪的东西,但是它运行了,问题就在这里

[imgView setNeedsDisplay];

正如我在您的代码中看到的那样,您希望它可以正常工作drawRect,但drawRect只会setNeedsDisplay当前视图上被调用,而不是在imgView,将其切换为

[self setNeedsDisplay];

它会起作用。您可能需要继承 UIImageView 来处理其中的 drawRect 。另外,我猜你想实际修改图像,因此尝试在其中绘制,尝试阅读在图像上下文中使用 CoreGraphics 。

关于其他问题

在我看来,主要问题是您混淆了 CALayers 和 CoreGraphics,就目前而言,您添加到 imageView 的 CALayer 完全未使用。只需在drawRect移动时设置 BezierPath 即可。

另外,在使用时要小心->了解自己的意图,我通常建议坚持@property使用 , 并使用self.myVarand _myVar

于 2013-07-21T08:36:53.087 回答