2016-02-06 2 views
1

J'ai sous-classé UIView afin de tracer une ligne qui change de position toutes les secondes. J'utilise NSTimer pour appeler setNeedsDisplay afin de mettre à jour la vue mais les résultats ne sont pas corrects. Il dessine des lignes anciennes et nouvelles. Voici mon code LineView.h/m:Redessiner un UIView en utilisant NSTimer ne fonctionnait pas comme prévu

LineView.h:

@interface LineView : UIView 
@property(nonatomic, assign) int length; 
@end 

LineView.m:

#import "LineView.h" 
@implementation LineView 
- (void)setLength:(int)length { 
    _length = length; 
    [self setNeedsDisplay]; 
} 
- (void)drawRect:(CGRect)rect {  
    UIBezierPath *line = [UIBezierPath bezierPath]; 
    [line moveToPoint:CGPointMake(10, 10)]; 
    [line addLineToPoint:CGPointMake(100, 100+_length)]; 
    line.lineWidth = 10; 
    [[UIColor blueColor] setStroke]; 
    [line stroke]; 
} 
@end 

Dans mon fichier ViewController.m, dans viewDidLoad, j'init lineView et démarrer le minuteur:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    _length = 100; 

    _lineView = [[LineView alloc]initWithFrame:self.view.bounds]; 
    _lineView.length = _length; 
    [self.view addSubview:_lineView]; 

    _timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTime:) userInfo:nil repeats:true]; 
} 

- (void)updateTime:(NSTimer*)timer { 
    _length += 20; 
    self.lineView.length = _length; 
} 

Je veux faire tout cela par programme et ne pas utiliser les storyboards ou les xibs. Si je sous-classe la vue dans le storyboard et crée un point de vente, la vue est mise à jour correctement, mais je veux éviter de toucher le storyboard.

+0

@rmaddy qui ne fera rien. [Selon les documents Apple] (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/index.html#//apple_ref/occ/instm/UIView/drawRect :), "* L'implémentation par défaut de cette méthode ne fait rien.Les sous-classes qui utilisent des technologies telles que Core Graphics et UIKit pour dessiner le contenu de leur vue doivent remplacer cette méthode et implémenter leur code de dessin. * " – Hamish

+0

@ originaluser2 Oui. Je viens juste de revoir une partie de mon code et aucune de mes méthodes 'drawRect:' appelle '[super drawRect:]'. Ça ne fait rien. – rmaddy

Répondre

0
_lineView.opaque = NO; 
_lineView.backgroundColor = [UIColor blackColor]; 

Essayez ceci. J'ai couru ton projet avec ça ça va bien.

+0

vous pouvez définir votre arrière-plan froid à tout je l'ai mis au noir. –

+0

Merci. Ça fonctionne maintenant. – hullabal00

+0

Veuillez également voir la documentation de la propriété opaque et clearContextBeforeDrawing de uiview. –