Могу ли я использовать drawRect для обновления подкласса UIView? - PullRequest
0 голосов
/ 18 июня 2010

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

// 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 Ответ

1 голос
/ 18 июня 2010

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

[self.view setNeedsDisplay];

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...