这是我第一次发帖,所以请原谅stackoverflow礼仪中的任何失误。
我还没有找到任何示例代码或解决我遇到的问题的任何问题,所以希望有人可以对此有所了解。
我正在使用 Quartz,我有一个 CATiledLayer,我在上面绘制了几个可以单击的框。当您单击一个时,我想用蓝色轮廓重绘该框,但不重绘视图的其余部分。从我读过的评论看来,一旦我在其中一个框的边界内单击,我应该使用 setNeedsDisplayInRect 而不是 setNeedsDisplay,并将脏矩形设置为该框的大小。但是,每当我的 (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);