1

这是我第一次发帖,所以请原谅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);
4

2 回答 2

1

好吧,如果我添加行 animLayer.levelsOfDetail = 2; 在 animLayer.levelsOfDetailBias 之后,它解决了我遇到的问题。现在正在将正确的矩形发送到 drawRect,并且在我更新时没有闪烁。我想这是一个非常简单的修复,我需要阅读如何使用levelsofDetailBias 和levelsOfDetail。

编辑:这实际上解决了我遇到的另一个问题,但我仍然无法将正确的dirtyRect传递给DrawRect,所以请忽略这个

于 2010-01-27T06:27:13.330 回答
0

来自Apple 的 Q&A-setNeedsDisplayInRect: :“如果您调用or ,整个视图将被重绘-setNeedsDisplay:。”

似乎该-setNeedsDisplayInRect:方法并没有比该方法带来任何好处-setNeedsDisplay:。这导致人们猜测这种行为是 iOS 处理重绘时的一个错误。

似乎没有一个干净简单的解决方案。其中的建议是将您的视图分解为几个子视图并请求仅对受影响的视图进行重绘,或者跟踪您自己重绘的区域。

包括我在内的其他一些人也有同样的问题,例如herehere

于 2013-05-27T17:48:39.027 回答