0

UIScrollView とその子であるカスタム ビューがあり、UIScrollView より幅が広いです。ときどきカスタムビューを拡大(幅だけ)して、拡大した部分だけを描き直したい。それが全体の問題です。残りは、私がこれを達成しようとする方法の詳細です。

いくつか検索した後、UIView.contentModeこの目的にぴったりのプロパティを見つけました。私はそれをいじりました(たとえば、に設定しますUIViewContentModeLeft)が、これから何の効果も得られませんでした。このプロパティは以前に使用したことがないため、正しく使用しなかった可能性があります。

私の問題はdrawRect:(CGRect)rect、カスタム ビューのメソッドが、拡大された四角形だけでなく、常にカスタム ビューの完全なサイズで呼び出されることです。これにより、カスタム ビューが大きくなるほど描画サイクルが長くなるため、パフォーマンスの問題が発生します。

更新コードで行うこと:

dispatch_async( dispatch_get_main_queue(), ^{
    uiScrollView.contentSize = ...; // increase width of contentSize
    customView.frame = ...; // increase width of customView accordingly

    CGRect visibleRect = [uiScrollView convertRect:uiScrollView.bounds toView:customView];

    printf("setNeedsDisplayInRect: %s\n", NSStringFromCGRect(visibleRect).UTF8String);

    [customView setNeedsDisplayInRect:visibleRect];
});

ただし、上記で指定した rect は、customView の drawRect: メソッドに到達しません。そこでも、次のように rect をログに記録します。

- (void) drawRect:(CGRect)rect {
    printf("drawRect: %s\n", NSStringFromCGRect(rect).UTF8String);

    // drawing code here
    // ...
}

代表的なオリジナル出力:

...
setNeedsDisplayInRect: {{426, 0}, {320, 192}}
setNeedsDisplayInRect: {{427, 0}, {320, 192}}
setNeedsDisplayInRect: {{427, 0}, {320, 192}}
setNeedsDisplayInRect: {{427, 0}, {320, 192}}
drawRect: {{0, 0}, {587, 192}}

背景: スクロールする波形ビューを作成しようとしています。記録時には、最後に記録された波形が表示されます。単純なラウンド バッファとカスタム ビューでこれを実現できますが、記録後に波形 (トラック) も表示され、ユーザーは標準のジェスチャを使用してスクロールできるようになるため、UIScrollView+ も使用したいと思います。 2 つの操作モード間で UI 構造の一貫性を保つために、記録中の customView UI 構造も同様です。

アップデート:

拡大された部分ではなく、customViewの表示部分を再描画しようとしていることに気づきました。ただし、それで問題全体が変わるわけではありません。その間、カスタムビューが拡大された四角形で試しました。これは、この場合は1座標単位の幅の四角形ですが、まったく同じ問題があります: drawRect: カスタムビューの完全なサイズで呼び出されます再描画されます。

これは、次のような疑問にもつながります。私のカスタム ビューの大部分は、表示領域からスクロールされるため、通常は見えません。iOS がカスタム ビューに、とにかく見えない領域を再描画するように指示するのはなぜですか?

4

1 に答える 1

1

-setNeedsDisplayInRect:その理由は、iOS では を呼び出すと常にビュー全体が更新対象としてマークされるためだと思います。こちらの同様の質問と、このTechnical Noteを参照してください。

解決策は、波形ビューをいくつかのサブビューに分割し、setNeedsDisplay内容が変更されたサブビューのみを呼び出すことです。

于 2013-05-27T17:06:37.363 に答える