1

これは私の初めての投稿です。

私が抱えている問題に対処するサンプルコードや質問が見つからないので、誰かがこれに光を当てることができることを願っています.

私は Quartz を使用しており、クリックできるいくつかのボックスを描いた CATiledLayer があります。いずれかをクリックすると、そのボックスを青いアウトラインで再描画しますが、ビューの残りの部分は再描画しません。私が読んだコメントから、ボックスの1つの境界内をクリックしたら、 setNeedsDisplay の代わりに setNeedsDisplayInRect を使用し、ダーティ rect をそのボックスのサイズに設定する必要があるようです。ただし、(void)drawRect:(CGRect)rect 関数が呼び出されるたびに、(void)drawRect:(CGRect)rect の四角形は、setNeedsDisplayInRect で無効にしようとした四角形に関係なく、常にビューのサイズになります。setNeedsDisplay または setNeedsDisplayInRect を他の場所で呼び出しているとは思いませんが、何らかの理由でビュー全体が無効になっています。CAtiledLayer を使用しない場合、この問題は発生しません。

これが私のコードの簡略版です:

#import <QuartzCore/QuartzCore.h>
#import <OpenGLES/EAGLDrawable.h>

#import "EAGLView.h"
#import "MapViewController.h"


// A class extension to declare private methods
@interface EAGLView ()

@property (nonatomic, retain) EAGLContext *context;

@end

@implementation EAGLView

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

- (id)initWithFrame:(CGRect)frame
{
    //self.frame.size.width is 920
    //self.frame.size.height is 790
    if (self = [super initWithFrame:frame]) {
        self.backgroundColor = [UIColor whiteColor];

        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
        _myContext = CGBitmapContextCreate(NULL, self.frame.size.width, self.frame.size.height, 8, 4*self.frame.size.width, colorSpace, kCGImageAlphaPremultipliedFirst);
        CGColorSpaceRelease(colorSpace);

        _myLayer = CGLayerCreateWithContext(_myContext, self.frame.size, NULL);

        CATiledLayer *animLayer = (CATiledLayer *) self.layer;
        animLayer.levelsOfDetailBias = 2;
        animLayer.tileSize = CGSizeMake(1000,1000);


    }
    return self;    
}


- (void)drawRect:(CGRect)rect {
    // Drawing code, rect is always equal to the size of the view (920,720)

}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{

    testRect = CGRectMake(0, 0, 100.0, 100.0);
    [self setNeedsDisplayInRect:testRect];
}

- (void)dealloc {

    [super dealloc];
}

@end

他の誰かがこのような問題に遭遇しましたか? これは CATiledLayer の制限ですか、それとも間違って使用しているだけですか? ちなみに、私が CATiledLayer を使用している理由は、UIScrollView でズームインおよびズームアウトするときに鮮明なグラフィックを維持できるようにするためだけです。CATiledLayer は UIScrollView に埋め込まれていますが、UIScrollView から CATiledLayer を削除しても、この問題は解決されません。ズームで「ベクトル化されたグラフィックス」効果を得るためのより良い代替案を誰かが提案できる場合は、お知らせください。私は CATiledLayer で多くの時間を費やしてきましたが、思い通りに動作させることができません。

編集:これらの行を削除しても、同じ問題が発生します:

CATiledLayer *animLayer = (CATiledLayer *) self.layer;
animLayer.levelsOfDetailBias = 2;
animLayer.tileSize = CGSizeMake(1000,1000);
4

2 に答える 2

1

うーん、animLayer.levelsOfDetail = 2; という行を追加すると、次のようになります。animLayer.levelsOfDetailBias の直後に、私が抱えていた問題が修正されました。現在、正しい四角形が drawRect に送信されており、更新してもちらつきはありません。これは非常に簡単な修正だったと思います。levelofDetailBias と levelsOfDetail の使用方法をよく読む必要があります。

編集:これは実際に私が抱えていた別の問題を修正しましたが、正しいdirtyRectをDrawRectに渡すことがまだできないので、これを無視してください

于 2010-01-27T06:27:13.330 に答える
0

Apple の Q&Aから:「-setNeedsDisplayInRect:またはを呼び出すと、ビュー全体が再描画されます-setNeedsDisplay:。」

この方法は、-setNeedsDisplayInRect:方法よりもメリットがないよう-setNeedsDisplay:です。これは、この動作が iOS の再描画処理のバグであるという推測につながりました。

クリーンでシンプルな解決策はないようです。提案の中には、ビューをいくつかのサブビューに分割し、影響を受けるものだけに再描画を要求するか、独自に再描画する領域を追跡することが含まれます。

私を含む他の何人かは、たとえばherehereなど、同じ問題を抱えていました。

于 2013-05-27T17:48:39.027 に答える