私は解決策を探していましたが、次のことが可能かどうかわかりません:
drawRectメソッドがあります。やりたいのは、グラフィック要素(rectsやlinesなど)を更新せずに現在のビューに追加することです。以前はsetNeedsDisplayを呼び出していましたが、このメソッドは実際にはmyViewを削除して、0から再描画しています。古いものを保持して新しいコンテンツを追加するための提案はありますか?
感謝
ビューで更新が行われるたびに、ビュー全体が再描画されます。したがって、 -drawRect はビュー全体を再描画する必要があります。ビューを「更新」する必要があります-それが標準です-それには何の問題もありません。古いコンテンツをもう一度描画するだけです。
または、setNeedsDisplayInRect:
ビューの特定のセクションだけを再描画する場合は、呼び出すことができます。
それがdrawRect:が行うことです-ビュー内のrectを再描画します。
線と四角形を上に描画する場合は、別のレイヤーで実行してみてください。
レイヤーで作業した方が良いと思います。形状の CALayer サブクラスを作成し、それらを配列に保存できます。
デフォルトでは、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];
}
他のグラフィック コンテンツがある場合は、そのような描画を行うことができます。コンテンツがたくさんある場合は、NSArray を追加するなどの UIView にバッファを追加する必要があり、drawRect メソッドに for(;;) を追加してすべてのグラフィック要素を描画します。
元の ioutlets を使用して、ビューとは別に描画するビューを作成することで、これを「回避」できます。次に、メイン ビューの背景を透明にします (ただし、ioutlets は透明にしないでください)。したがって、この例では、維持したい (描画しない) IBOutlets が UITextField、UILabel、および UIButton であることを防止します。したがって、Interface Builder は次のようになります。
UIVIewController
UIView2 (view with drawRect defined)
UIView (main)
UITextField
UILabel
UIButton
ご覧のとおり、「drawRect」を呼び出すと、UIView2 が完全に空白になりますが、「drawRect」は UILabel、UIButton、UITextField、または保持したいものを削除しないため、問題はありません。あなたのUIView1。お役に立てれば。
すべての形状を保存して新しい形状を追加するには、おそらく NSBezierPath のようなものが必要だと思います。新しいシェイプを既存の NSBezierPath に簡単に追加できます。ドキュメントを参照して ください: https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSBezierPath_Class/Reference/Reference.html drawrect を使用すると、NSBezierPath をストロークまたは塗りつぶすだけで済みます。
これは、すべてのシェイプの塗りつぶしの色と線が同じ場合にのみ機能します。それ以外の場合は、複数の NSBezierPath のある種のリストを保持し、それらをさまざまな方法でストローク/塗りつぶすことができます。