C'est la première fois que j'envoie un message, donc s'il vous plaît, excusez toute erreur dans l'étiquette de stackoverflow.setNeedsDisplayInRect redessiner l'intégralité de la vue lors de l'utilisation de CATiledLayer
Je n'ai pas trouvé de code d'exemple ou de questions qui résolvent le problème que j'ai, alors j'espère que quelqu'un pourra faire la lumière là-dessus. J'utilise Quartz et j'ai un CATiledLayer sur lequel j'ai dessiné plusieurs cases sur lesquelles vous pouvez cliquer. Lorsque vous cliquez sur un, je veux redessiner cette boîte avec un contour bleu, mais pas redessiner le reste de la vue. D'après les commentaires que j'ai lus il semble que je devrais utiliser setNeedsDisplayInRect au lieu de setNeedsDisplay une fois que j'ai cliqué dans les limites de l'une des boîtes, et mettre le rect sale à la taille de cette boîte. Cependant, chaque fois que ma fonction (void) drawRect: (CGRect) rect est appelée, le rect dans (void) drawRect: (CGRect) rect est toujours la taille de ma vue, quel que soit le rect que j'ai essayé d'invalider dans setNeedsDisplayInRect. Je ne pense pas que j'appelle setNeedsDisplay ou setNeedsDisplayInRect ailleurs, mais pour une raison quelconque, la vue entière est invalidée. Si je n'utilise pas de CATiledLayer, ce problème n'apparaît pas et DrawRect reçoit le rect correct lorsque setNeedsDisplayInRect est appelé.
Voici une version simplifiée de mon code:
#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
Quelqu'un at-il lancer d'autre dans un problème comme celui-ci? Est-ce une limitation de CATiledLayer ou est-ce que je ne l'utilise pas correctement? En passant, la raison pour laquelle j'utilise le CATiledLayer est uniquement pour que je puisse maintenir des graphiques nets comme je zoom avant et arrière sur un UIScrollView. Le CATiledLayer est incorporé dans un UIScrollView, mais la suppression de CATiledLayer de UIScrollView ne résout pas ce problème. Si quelqu'un peut suggérer une meilleure alternative pour obtenir l'effet "graphiques vectorisés" sur le zoom, s'il vous plaît faites le moi savoir. J'ai passé beaucoup de temps avec CATiledLayer et je ne peux pas l'obtenir pour faire ce que je veux.
Edit: Je peux supprimer ces lignes et toujours obtenir le même problème:
CATiledLayer *animLayer = (CATiledLayer *) self.layer;
animLayer.levelsOfDetailBias = 2;
animLayer.tileSize = CGSizeMake(1000,1000);
s'il vous plaît ajouter vos modifications comme un commentaire ou mettre à jour votre question, s'il vous plaît ne pas poster des commentaires ou mises à jour comme réponses –
À la réflexion, je ne suis pas sûr de vraiment comprendre ce qui se passe. Quelqu'un peut-il clarifier cette situation? – Rick
Madhup: Huh? C'est la solution du problème au questionneur. Une solution au problème * devrait * être affichée comme réponse. –