如何绘制UIBezierPaths

时间:2011-06-22 04:32:43

标签: ios objective-c uibezierpath

这就是我想要做的事情:

我有一个UIBezierPath,我想将它传递给某个方法来绘制它。或者只是从创建它的方法中绘制它。

我不知道如何指出应该绘制哪个视图。所有绘图方法都必须从

开始
- (void)drawRect:(CGRect)rect { ...} ?

我可以吗

- (void)drawRect:(CGRect)rect withBezierPath:(UIBezierPath*) bezierPath { ... } ??

如何从其他方法调用此函数或方法?

5 个答案:

答案 0 :(得分:20)

drawRect:是在视图上向setNeedsDisplaysetNeedsDisplayInRect:发送消息时自动调用的内容。您永远不会直接致电drawRect:

但是你说的是所有的绘图操作都是在drawRect:方法中完成的。典型的实现是,

- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();

    /* Do your drawing on `context` */
}

由于您使用的是UIBezierPath,因此您需要维护一系列需要绘制的贝塞尔曲线路径,然后在发生变化时调用setNeedsDisplay

- (void)drawRect:(CGRect)rect {    
    for ( UIBezierPath * path in bezierPaths ) {
        /* set stroke color and fill color for the path */
        [path fill];
        [path stroke];
    }
}

其中bezierPathsUIBezierPath s的数组。

答案 1 :(得分:6)

首先,将您的路径保存在ivar

@interface SomeView {
  UIBezierPath * bezierPath;
}
@property(nonatomic,retain) UIBezierPath * bezierPath;
...
@end
....
- (void)someMethod {
     self.bezierPath = yourBezierPath;
     [self setNeedsDisplayInRect:rectToRedraw];
}

in -drawRect:

- (void)drawRect:(CGRect)rect {
    CGContextRef currentContext = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(currentContext, 3.0);
    CGContextSetLineCap(currentContext, kCGLineCapRound);
    CGContextSetLineJoin(currentContext, kCGLineJoinRound);
    CGContextBeginPath(currentContext);
    CGContextAddPath(currentContext, bezierPath.CGPath);
    CGContextDrawPath(currentContext, kCGPathStroke);
}

答案 2 :(得分:3)

当您需要自定义视图时,可以覆盖子类上的-drawRect:

- (void)drawRect:(CGRect)rect
{
  // config your context
  [bezierPath stroke];
}

编辑:直接使用-stroke使代码更紧凑。

答案 3 :(得分:1)

绘图只发生在名为-drawRect:的方法中(当视图被标记为需要通过setNeedsDisplay显示时自动调用)。因此永远不会自动调用drawRect:withBezierPath:方法。它执行的唯一方法就是你自己调用它。

然而,一旦你有了UIBezierPath,就可以很容易地绘制它:

- (void)drawRect:(CGRect)rect {
  UIBezierPath *path = ...; // get your bezier path, perhaps from an ivar?
  [path stroke];
}

如果您想要做的就是绘制路径,则无需使用Core Graphics。

答案 4 :(得分:1)

你可以做以下事情。只需定义一个UIColor * setStroke;在.h文件中,您需要在调用[myPath strokeWithBlendMode:kCGBlendModeNormal alpha:1.0];

之前设置此strokeColor对象
 - (void)drawRect:(CGRect)rect
    {
        [strokeColor setStroke]; // this method will choose the color from the receiver color object (in this case this object is :strokeColor)
        for(UIBezierPath *_path in pathArray)
            [myPath strokeWithBlendMode:kCGBlendModeNormal alpha:1.0];
    }

    #pragma mark - Touch Methods
    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
        myPath=[[UIBezierPath alloc]init];
        myPath.lineWidth = currentSliderValue;

        UITouch *mytouch=[[touches allObjects] objectAtIndex:0];
        [myPath moveToPoint:[mytouch locationInView:self]];
        [pathArray addObject:myPath];
    }
    -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
    {
        UITouch *mytouch=[[touches allObjects] objectAtIndex:0];
        [myPath addLineToPoint:[mytouch locationInView:self]];
        [self setNeedsDisplay];

    }