2012-10-10 40 views
0

我一直在寻找解决方案,但无法弄清楚是否可以做到以下几点:用的drawRect方法绘制 - 可可

我有一个方法的drawRect,我想要做的就是添加一个图形元素(例如rects和lines)到当前视图而不刷新它。我曾经调用setNeedsDisplay,但这种方法实际上是删除myView重新从0绘制它..任何建议,以保持旧的和添加新的内容?

谢谢

回答

0

这就是drawRect:它 - 它重绘视图中的矩形。

如果您想在上面绘制线条和rects,请尝试在不同的图层上进行绘制。

1

每次在视图中进行更新时,它的整体都会重新绘制;所以-drawRect需要重绘整个视图。你必须“刷新”你的观点 - 这是常态 - 它没有错。只需再次绘制旧内容。或者,如果您只想重新绘制视图的特定部分,则可以调用setNeedsDisplayInRect:

+0

是的,但是如何“保存”旧内容的某个地方,以便稍后用其他形状或内容重新绘制它? –

0

我想如果使用图层,效果会更好。 您可以为您的形状制作CALayer子类,然后将它们保存在一个数组中。

0

默认情况下,drawRect方法会清除整个内容,如果你想动态地将一些新的图形内容绘制到视图中,你应该抽象这些图形元素的数据结构,例如,你添加一行,这一行将会有

 
     a start point 
     a end point 
     line color 
     line width 
     is has a shadow 
     a line join

,所以你可以把所有这些财产成一个结构,定义名为LineStruct一个新的数据类和定义一个名为

-(void)drawLine:(CGContextRef)ctx withLineStruct:(LineStruct*)lineStruct 

您自定义的UIView方法,定义一个

@property(nonatomic)LineStruct * lineStruct;

,并调用它的drawRect方法

-(void)drawRect:(CGContextRef)ctx{ 
     CGContextRef ctx = UIGraphicsGetCurrentContext() ; 
     [self drawLine:ctx withLineStruct:self.lineStruct]; 
    } 

因此,如果您有其他图形的内容,你可以做这样的抽奖。如果你有很多 的内容,你必须添加一个缓冲区到你的UIView,比如添加一个NSArray,并且在drawRect方法中,你添加一个for(;;)来绘制所有的图形元素

0

我想也许你需要类似NSBezierPath的东西来存储所有的形状并添加新的形状。将新形状添加到现有的NSBezierPath中很容易,请参阅文档:https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSBezierPath_Class/Reference/Reference.html 然后在您的drawrect中,您只需要描边或填充NSBezierPath。

只有当您的所有形状具有相同的填充颜色和描边时,此功能才有效。否则,你可以保留多种NSBezierPaths的列表,并以不同的方式填充/填充它们。

0

您可以通过将视图与原始iboutlet分开绘制到视图中来“解决”这个问题。然后让你的主视图背景透明(但不要让iboutlets透明)。所以对于这个例子,我会阻止你想保留的IBOutlets(不是绘制)是一个UITextField,一个UILabel和一个UIButton。 所以你Interface Builder中看起来就像这样:

UIVIewController 
    UIView2 (view with drawRect defined) 
    UIView (main) 
    UITextField 
    UILabel 
    UIButton 

所以你看,当你调用“的drawRect”它仍然会空出你的UIView2完全,但它并不重要,因为“的drawRect”不会删除UILabel,UIButton,UITextField或任何你想保留在你的UIView1中的任何东西。希望这可以帮助。

相关问题