1

私はパッチ ベイ コントロールを作成しており、UIViews を使用してパッチ間のリンクを描画しています。

これらのリンクは大きな UIView のサブビューであり、それ自体が UIScrollView のサブビューです。

リンクは非常に大きくなる可能性があり、通常は画面サイズの 4 倍になります。エンド パッチの 1 つが移動すると、リンクを再描画する必要があります。

ただし、リンクの一部しか表示されない場合があります。

Instruments は、ほとんどの時間が QCLink drawRect メソッドに費やされていることを示しています。

この QCLink を再描画する必要があるたびに、QCLink の完全な境界で drawRect メソッドが呼び出されることを確認しました。

これは、UIView の一部 ( drawRect:) の rect 引数のみを再描画する必要がある状況ですか?

ここに、私が直面している問題を理解するのに役立つスクリーン キャプチャをいくつか示します。

初期状態 ノードをドラッグしてリンクを延長する 同じノード、ズームアウト

4

3 に答える 3

1

drawRect が UIView のフル フレームを受信しないのはどのような場合ですか?

描画の実装は、常にビューの一部を描画する準備ができている必要があります。一部のタスクでは、デフォルトのクリッピングが適切です。

ビューの無効化プロセスに従ってください。四角形を無効にすると、ビュー システムはビューをトラバースし、その四角形にあるものを描画するように要求します (不透明度などを考慮して)。その rect は rect の結合 (で構成される) かもしれませんが、それもシステムによってクリップされる可能性があります。

したがって、おそらく過剰な描画または冗長な描画を行っている可能性があります-それをどのように削減できるかを検討してください. 手始めに、すべてのコードを 1 つのビューに配置し、不透明でない表面を最小限に抑えるためにできる限りのことを行うことをお勧めします。その後、オーバードローしている場所を特定する必要があります。Quartz Debug は、これらの冗長な描画を指摘できます。特に描画時間が重要な場合は、setNeedsDisplayInRect:ではなくを使用する必要があります。setNeedsDisplay

于 2013-10-03T19:19:15.413 に答える
1

あなたはおそらくを探していCATiledLayerます。タイル レイヤーは、画面上にあり、レンダリングする必要がある部分のみを描画するため、画面に対して大きすぎる可能性のあるビューや、ピンチしてズームする場所に最適です。これらは、ビューのようなUIWebViewレンダリング方法の中核です。

タイル レイヤーを使用するようにビューを切り替えるには、次のメソッドを宣言するだけです。

+ (Class)layerClass
{
    return [CATiledLayer class];
}

drawRect:その後、のような値を持つ への呼び出しが表示されるよう(0, 0, 256, 256)になり(0, 256, 256, 256)ます...

setNeedsDisplayInRect:物事を動かすときは、代わりに を呼び出すことで、パフォーマンスをさらに向上させることができますsetNeedsDisplay。これにより、無効化された四角形への描画が制限されます。

于 2013-10-03T19:01:33.803 に答える
0

それは常に完全な長方形です。CAShapeLayer代わりに sを使用するのはどうですか?

何かのようなもの:

CAShapeLayer * link = [ CAShapeLayer layer ] ;
link.strokeColor = [ [ UIColor greenColor ] CGColor ] ;

CGMutablePathRef p = CGPathCreateMutable() ;
CGPathMoveToPoint( p, NULL, start ) ;
CGPathAddLineToPoint( p, NULL, end ) ;
link.path = path ;

[ parentView.layer addSublayer:link ] ;
于 2013-10-03T18:06:11.547 に答える