これは私の初めての投稿です。
私が抱えている問題に対処するサンプルコードや質問が見つからないので、誰かがこれに光を当てることができることを願っています.
私は 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);