用drawRect方法绘图 - 可可

时间:2012-10-10 17:08:10

标签: cocoa view drawrect nsrect

我一直在寻找解决方案,但无法弄清楚是否可以执行以下操作:

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

感谢

6 个答案:

答案 0 :(得分:1)

每次在视图中进行更新时,都会重新绘制全部内容;所以-drawRect需要重绘整个视图。你必须“刷新”你的观点 - 这是常态 - 它没有任何问题。只需再次绘制旧内容。

或者,如果您只想重新绘制视图的特定部分,可以致电setNeedsDisplayInRect:

答案 1 :(得分:0)

这就是drawRect:它 - 它在视图中重绘了rect。

如果您想要在顶部绘制线条和线条,请尝试在其他图层上进行。

答案 2 :(得分:0)

我想如果你使用图层会更好。 您可以为形状创建CALayer子类,然后将它们保存在数组中。

答案 3 :(得分: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(非原子)LineStruct * lineStruct;

并在其中调用drawRect方法

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

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

答案 4 :(得分:0)

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

这仅适用于所有形状具有相同填充颜色和笔划的情况。否则你可以保留一些多个NSBezierPaths的列表,并以不同的方式描边/填充它们。

答案 5 :(得分:0)

你可以绕过'这可以通过使用原始ibout创建您想要与视图分开绘制的视图。然后使主视图背景透明(但不要使iboutlet透明)。因此,对于此示例,我将阻止您要保留(不绘制)的IBOutlet是UITextField,UILabel和UIButton。 所以Interface Builder将如下所示:

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

如您所见,当您致电' drawRect'它仍然会完全消除你的UIView2,但它不重要因为' drawRect'不会删除UILabel,UIButton,UITextField中的任何内容或您想要保留在UIView1中的任何其他内容。希望这会有所帮助。