我一直在寻找解决方案,但无法弄清楚是否可以执行以下操作:
我有一个drawRect方法,我想要做的是将一个图形元素(如rects和lines)添加到当前视图而不刷新它。我以前调用setNeedsDisplay,但是这个方法实际上是删除myView,从0重新绘制它。有任何建议保留旧的并添加新内容吗?
感谢
答案 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中的任何其他内容。希望这会有所帮助。