这就是我想要做的事情:
我有一个UIBezierPath,我想将它传递给某个方法来绘制它。或者只是从创建它的方法中绘制它。
我不知道如何指出应该绘制哪个视图。所有绘图方法都必须从
开始- (void)drawRect:(CGRect)rect { ...} ?
我可以吗
- (void)drawRect:(CGRect)rect withBezierPath:(UIBezierPath*) bezierPath { ... } ??
如何从其他方法调用此函数或方法?
答案 0 :(得分:20)
drawRect:
是在视图上向setNeedsDisplay
或setNeedsDisplayInRect:
发送消息时自动调用的内容。您永远不会直接致电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];
}
}
其中bezierPaths
是UIBezierPath
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];
- (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];
}