2016-02-06 7 views
1

Я подклассифицировал UIView, чтобы нарисовать линию, которая меняет позицию каждую секунду. Я использую NSTimer для вызова setNeedsDisplay, чтобы обновить представление, но результаты неверны. Он рисует старые и новые линии. Вот мой LineView.h/м Код:Перерисование UIView с использованием NSTimer не работает как ожидалось

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 

В моем файле ViewController.m, в viewDidLoad, я инициализации lineView и запуск таймера:

- (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; 
} 

Я хочу сделать это все программно и не использовать раскадровки или xibs. Если я подклассифицирую представление в раскадровке и создаю для него выход, то представление будет обновлено правильно, но я хочу избежать касания раскадровки.

+0

@rmaddy, который ничего не сделает. [Согласно документам Apple] (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/index.html#//apple_ref/occ/instm/UIView/drawRect :), "* По умолчанию реализация этого метода ничего не делает. Подклассы, которые используют такие технологии, как Core Graphics и UIKit, чтобы нарисовать контент своего представления, должны переопределить этот метод и реализовать там свой код рисования. * « – Hamish

+0

@ originaluser2 Да. Я просто просмотрел некоторые из моего кода, и ни один из методов 'drawRect:' не вызывает '[super drawRect:]'. Неважно. – rmaddy

ответ

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

попробуйте это. Я запустил ваш проект, и это хорошо.

+0

вы можете установить фоновый холод для любого, я установил его в черный. –

+0

Спасибо. Он работает сейчас. – hullabal00

+0

, пожалуйста, также просмотрите документацию для непрозрачного и clearContextBeforeDrawing свойства uiview. –

 Смежные вопросы

  • Нет связанных вопросов^_^