0

我一直在寻找解决方案,但不知道是否可以执行以下操作:

我有一个 drawRect 方法,我想做的是在当前视图中添加一个图形元素(如矩形和线条)而不刷新它。我曾经调用 setNeedsDisplay 但此方法实际上是删除 myView 并从 0 重新绘制它。有什么建议可以保留旧的并添加新内容吗?

感谢

4

6 回答 6

1

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

或者,setNeedsDisplayInRect:如果您确实只想重绘视图的特定部分,则可以调用。

于 2012-10-10T23:51:08.337 回答
0

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

       一个起点
       一个终点
       线条颜色
       行宽
       是有阴影
       线连接

因此您可以将所有这些属性放入一个结构中并定义一个名为 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(;;) 来绘制所有图形元素

于 2012-11-18T07:23:39.693 回答
0

您可以通过使用原始 iboutlets 使您想要绘制的视图与您的视图分开来“解决”这个问题。然后使您的主视图背景透明(但不要使 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。希望这可以帮助。

于 2014-03-31T01:40:54.423 回答
0

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

于 2012-10-11T11:31:39.417 回答
0

这就是 drawRect: 所做的——它在视图中重绘矩形。

如果您想在顶部绘制线条和矩形,请尝试在不同的图层上进行。

于 2012-10-10T17:37:55.237 回答
0

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

仅当您的所有形状都具有相同的填充颜色和描边时,这才有效。否则,您可以保留某种类型的多个 NSBezierPaths 列表并以不同的方式描边/填充它们。

于 2013-06-18T09:51:36.613 回答