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
实例之前调用 setFill
或 setStroke
在 UIBezierPath 上调用 fill
或 stroke
应该设置填充/描边颜色。如果没有,请再次检查您的 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 绘图问题的主要内容,如果未能解决你的问题,请参考以下文章
iOS绘图—— UIBezierPath 和 Core Graphics
iOS 开发 Quartz 2D+ UIBezierPath绘图大全详解