我可以使用drawRect刷新UIView子类吗?

时间:2010-06-18 12:11:16

标签: objective-c

我创建了一个名为Status的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];
    }

如何设置它以便我可以反复调用状态栏的刷新?我可能会使用NSTimer每秒调用4次刷新,我只是不确定要调用什么,或者我是否应该将此矩形绘图移动到单独的函数或其他内容...

提前感谢您的帮助:)

1 个答案:

答案 0 :(得分:1)

只需使用

[self.view setNeedsDisplay];
来自您的视图控制器的

。您可能希望在主线程上实现此目的,因此可以使用performSelectorOnMainThread:withObject:waitUntilDone:

进行包装

如果您需要指定,还有setNeedsDisplayInRect:。但是您的代码是轻量级且快速的,您可能需要对更新的区域进行计算以计算包含的rect。所以我只是更新整个UIView,如果它似乎没有显着减慢您的应用程序。

作为旁注,您可能想要创建您的名称属性(副本),因此它不会在您的脚下发生变化(并在createSatus中使用self.name = ...来使用属性访问器。在这种情况下,请别忘了在dealloc中发布它。

我建议不要在视图控制器中调用setNeedsDisplay:,只要属性发生变化,我就建议在视图中调用它。