UIBezierPath 绘图问题

Posted

技术标签:

【中文标题】UIBezierPath 绘图问题【英文标题】:UIBezierPath drawing issues 【发布时间】:2012-06-22 11:14:06 【问题描述】:

我创建了一个名为 myBezierPaths 的类,有两个类型为 UIBezierPath 和 UIColor 的成员变量,然后我尝试使用该类的对象来绘制 bezierpath,但我没有得到 bezierpath,下面是我的代码

//Bezierpath.h

@interface BezierPath : NSObject

UIBezierPath *m_bezierPath;
UIColor *m_pathColor;


@property (nonatomic, strong) UIBezierPath *bezierPath;
@property (nonatomic, strong) UIColor *pathColor;
@end


//drawingView.m


- (void)drawRect:(CGRect)rect
 
for (BezierPath *pathobj in m_pathArray) 
 
[pathobj.pathColor setStroke];
[pathobj.pathColor setFill];
[pathobj.bezierPath strokeWithBlendMode:kCGBlendModeNormal alpha:1.0]; 
 


-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

*self.myPath = [[BezierPath alloc] init];*

myPath.bezierPath.lineWidth = 5; 
myPath.bezierPath.lineCapStyle = kCGLineCapRound;
myPath.bezierPath.flatness = 0.0;
myPath.bezierPath.lineJoinStyle = kCGLineJoinRound;
myPath.bezierPath.miterLimit = 200.0;

self.myPath.pathColor = [UIColor redColor];

UITouch *mytouch=[[touches allObjects] objectAtIndex:0]; 

[myPath.bezierPath moveToPoint:[mytouch locationInView:self]];
[m_pathArray addObject:self.myPath];




- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event


    UITouch *mytouch=[[touches allObjects] objectAtIndex:0];
    [self.myPath.bezierpath addLineToPoint:[mytouch locationInView:self]];    

    [self setNeedsDisplay];    

希望我的解释清楚,等待回复

问候 兰吉特

【问题讨论】:

[self setNeedsDisplay]; ,试试这个.. 嘿,谢谢你的回复,但它不会工作 记住 Bezierpath 中 E 之前的 I 【参考方案1】:

首先,在您的drawRect 中,您实际上并没有填充形状。您确实对其进行了描边(基本上画了一个边框),但您需要调用[pathObj.bezierPath fill]; 来实际用颜色填充形状。

您没有显示很多代码,因此很难判断问题出在哪里。我会在drawRect 方法中创建一个断点来确定是否所有变量都在那里。例如,您显示(我假设)是一个数组:m_pathArray。你确定它已经初始化了吗?你确定BezierPath 的属性工作正常吗?我注意到在touchesBegan 上,您设置了pathColor,但只能访问/读取bezierPath 变量。那已经初始化了吗?您在哪里创建“m_bezierPath”实例变量?您是在 BezierPath init 方法中创建它还是在访问时懒惰地实例化它?

所以这些是您可以检查的几件事。

【讨论】:

谢谢您的回复,m_bezierPath 实例变量在 UIBezeirPath 的 init 中被初始化,m_pathArray 也被初始化,mypath 是 BezeirPath(custom Class) 类型的对象 你在drawRect中设置断点并检查变量吗?一个有用的提示:您可以通过键入:po variable_name 在控制台中检查变量。您甚至可以进行方法调用,因此要检查 pathobj 是否返回正确的 UIBezierPath,您可以键入:po [pathobj bezierPath] 在循环中检查它是否返回正确的 UIBezierPath。 嘿亚伦我的问题解决了我没有在自定义数组中初始化我的 customClass BezierPath 的成员。现在我想知道如何为我的 bezierPath 设置不同的颜色? 在调用 UIColor 实例之前调用 setFillsetStroke 在 UIBezierPath 上调用 fillstroke 应该设置填充/描边颜色。如果没有,请再次检查您的 pathobj 是否返回了有效的 UIColor 对象。 嘿,谢谢 Aaron,这个问题已经解决了,我想将橡皮擦实现为典型的真字橡皮擦,哪些橡皮擦只有被摩擦的特定部分,我该如何实施任何建议。【参考方案2】:

您没有显示您的 touchesMoved 事件处理程序,但我希望有这样的事情。否则,您所做的只是创建一组长度为零的路径。

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event


UITouch *mytouch=[[touches allObjects] objectAtIndex:0]; 

[self.myPath.bezeirPath lineToPoint:[mytouch locationInView:self]];



【讨论】:

嘿沃伦,谢谢你的回复,我已经添加了我的 touchesMoved 事件处理程序,它和你写的一样,但我不明白,我哪里出错了。以前我使用 UIBezeirpath 的一个对象并且它正在工作,只要我创建了一个类,它就无法正常工作【参考方案3】:

@Ranjit 需要一些帮助我有同样的问题...... 我想改变 UIbezierpath 的颜色。 但是当我选择颜色时,我以前的路径也会自动用新颜色着色。

在我的第一张图片中,我画了一条线,选择的颜色是红色。 但是当我选择黄色绘制另一条线时,前一行也变为黄色。(图片 2)

【讨论】:

嗨 umesh,如果你使用 bezeirPath 来绘制,创建一个由两个成员变量组成的类 1) UIBezeirPath 和第二个是 UIColor,并正确初始化它,然后查看上面的代码,你会很好去

以上是关于UIBezierPath 绘图问题的主要内容,如果未能解决你的问题,请参考以下文章

用于手指触摸绘图的 UIBezierPath 平滑曲线

iOS绘图—— UIBezierPath 和 Core Graphics

iOS UIBezierPath绘图相关问题

iOS 开发 Quartz 2D+ UIBezierPath绘图大全详解

用贝赛尔曲线把图片, 按钮, label 绘成圆 或圆角矩形

Objective-C 如何避免在具有 UIBezierPath 笔触颜色的相同颜色图像上绘图