2010-06-18 4 views
0

Я создал подкласс UIView, называемый Status, который предназначен для отображения прямоугольника определенного размера (внутри представления) в зависимости от значения переменной.Могу ли я использовать drawRect для обновления подкласса UIView?

// Interface 
#import <Foundation/Foundation.h> 
#import <QuartzCore/QuartzCore.h> 

@interface Status: UIView { 
    NSString* name; 
    int someVariable; 
    } 

@property int someVariable; 
@property (assign) NSString *name; 

- (void) createStatus: (NSString*)withName; 
- (void) drawRect:(CGRect)rect; 

@end 

// Implementation 
#import "Status.h" 
@implementation Status 
@synthesize name, someVariable; 

- (void) createStatus: (NSString*)withName { 
    name = withName; 
    someVariable = 10000; 
} 

- (void) drawRect:(CGRect)rect { 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    //Draw Status 
    CGContextSetRGBFillColor(context, 0.0, 0.0, 1.0, 1); // fill  
    CGContextFillRect(context, CGRectMake(0.0, 0.0, someVariable, 40.0)); 
} 

//// myviewcontroller implementation 
    - (void) viewDidAppear:(BOOL)animated { 
     [super viewDidAppear:animated]; 
     myStatus = [[Status alloc] initWithFrame:CGRectMake(8,8,200,56)]; 
     myStatus.backgroundColor = [UIColor grayColor]; 
     [self.view addSubview:myStatus]; 
    } 

Как настроить это, чтобы неоднократно вызывать обновление строки состояния? Я, вероятно, буду называть обновление 4 раза в секунду с помощью NSTimer, я просто не уверен, что мне нужно позвонить, или если я должен переместить этот чертеж прямоугольника на отдельную функцию или что-то еще ...

Заранее благодарим за помочь :)

ответ

1

Просто используйте

[self.view setNeedsDisplay]; 

из контроллера представления. Вероятно, вы захотите сделать это на основной нити, поэтому, возможно, оберните его performSelectorOnMainThread:withObject:waitUntilDone:

setNeedsDisplayInRect: Если вам нужно указать это тоже. Но ваш код является легким и быстрым, и вам, вероятно, нужно сделать расчеты для обновленной области для вычисления содержащего прямоугольника. Поэтому я просто обновляю весь UIView, если он не замедлит ваше приложение.

В качестве побочного примечания вы, вероятно, захотите сделать свое имя (копия), поэтому оно не изменяется под вашими ногами (и используйте self.name = ... в createSatus для использования аксессуаров свойств. В этом случае не забывайте выпустить его в dealloc

Вместо вызова setNeedsDisplay:. от контроллера зрения, я предлагаю назвать это внутри самого зрения всякий раз, когда изменяется свойство

+0

слишком легко, это прекрасно :). – Timbo