Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone setNeedsDisplayInRect使用CATiledLayer时重新绘制整个视图_Iphone_Core Graphics_Quartz Graphics_Tiles - Fatal编程技术网

Iphone setNeedsDisplayInRect使用CATiledLayer时重新绘制整个视图

Iphone setNeedsDisplayInRect使用CATiledLayer时重新绘制整个视图,iphone,core-graphics,quartz-graphics,tiles,Iphone,Core Graphics,Quartz Graphics,Tiles,这是我第一次发帖,请原谅我在礼节上的任何失误 我还没有找到任何示例代码或任何问题来解决我遇到的问题,所以希望有人能对此有所帮助 我用的是石英,我有一个CATiledLayer,我在上面画了几个框,你可以点击。单击其中一个时,我希望用蓝色轮廓重新绘制该框,但不重新绘制视图的其余部分。从我读到的评论来看,当我在其中一个框的边界内单击并将dirty rect设置为该框的大小时,似乎应该使用setNeedsDisplayInRect而不是setNeedsDisplay。但是,每当调用my(void)dr

这是我第一次发帖,请原谅我在礼节上的任何失误

我还没有找到任何示例代码或任何问题来解决我遇到的问题,所以希望有人能对此有所帮助

我用的是石英,我有一个CATiledLayer,我在上面画了几个框,你可以点击。单击其中一个时,我希望用蓝色轮廓重新绘制该框,但不重新绘制视图的其余部分。从我读到的评论来看,当我在其中一个框的边界内单击并将dirty rect设置为该框的大小时,似乎应该使用setNeedsDisplayInRect而不是setNeedsDisplay。但是,每当调用my(void)drawRect:(CGRect)rect函数时,(void)drawRect:(CGRect)rect中的rect始终是我视图的大小,无论我试图在setNeedsDisplayInRect中使哪个rect无效。我不认为我在其他任何地方调用setNeedsDisplay或setNeedsDisplayInRect,但由于某种原因,整个视图无效。如果不使用CATiledLayer,则不会出现此问题,并且在调用setNeedsDisplayInRect时,DrawRect会收到正确的rect

以下是我的代码的简化版本:

#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

嗯,如果我加上animLayer.levelsOfDetail=2;就在animLayer.levelsOfDetailBias之后,它修复了我遇到的问题。正确的rect现在被发送到drawRect,并且在我更新时没有闪烁。我想这是一个非常简单的解决方案,我需要仔细阅读如何使用levelsofDetailBias和levelsOfDetail


编辑:这实际上修复了我遇到的另一个问题,但我仍然无法获得传递给DrawRect的正确dirtyRect,因此请忽略这一点,好吧,似乎如果我添加animLayer.levelsOfDetail=2这一行;就在animLayer.levelsOfDetailBias之后,它修复了我遇到的问题。正确的rect现在被发送到drawRect,并且在我更新时没有闪烁。我想这是一个非常简单的解决方案,我需要仔细阅读如何使用levelsofDetailBias和levelsOfDetail

编辑:这实际上修复了我遇到的另一个问题,但我仍然无法获得传递给DrawRect的正确dirtyRect,因此请忽略以下内容:“如果调用
-setNeedsDisplayInRect:
-setNeedsDisplay:
,整个视图将被重新绘制”

似乎
-setNeedsDisplayInRect:
方法与
-setNeedsDisplay:
方法相比没有任何好处。这导致人们猜测,这种行为是iOS处理重画的一个缺陷

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

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

From:“如果调用
-setNeedsDisplayInRect:
-setNeedsDisplay:
,整个视图将被重新绘制。”

似乎
-setNeedsDisplayInRect:
方法与
-setNeedsDisplay:
方法相比没有任何好处。这导致人们猜测,这种行为是iOS处理重画的一个缺陷

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


其他一些人,包括我,也有同样的问题,例如和。

请添加您的编辑作为评论或更新您的问题,请不要发布评论或更新作为回答。我不确定我是否真的了解发生了什么。有人能澄清这个情况吗?嗯?这是提问者对问题的解答。问题的解决方案应该作为答案发布。瑞克:你已经发布了关于你自己问题的答案。据我所知,它回答了这个问题,所以这没什么错。(有些人把这搞砸了,并在非回答答案中提及其他答案或评论。)对不起,各位,我发布此答案时认为我已经回答了自己的问题,但我错了,我仍然无法找出如何让drawRect获得正确的dirtyRect。请将您的编辑添加为评论或更新您的问题,请不要发表评论或更新作为回答。我不确定我真的了解发生了什么。有人能澄清这个情况吗?嗯?这是提问者对问题的解答。问题的解决方案应该作为答案发布。瑞克:你已经发布了关于你自己问题的答案。据我所知,它回答了这个问题,所以这没什么错。(有些人把这搞砸了,并在非回答答案中提及其他答案或评论。)对不起,各位,我发布此答案时认为我已经回答了自己的问题,但我错了,我仍然不知道如何让drawRect获得正确的方向。
CATiledLayer *animLayer = (CATiledLayer *) self.layer;
animLayer.levelsOfDetailBias = 2;
animLayer.tileSize = CGSizeMake(1000,1000);