我想在我现有的 UIView 上绘制图形
I want to draw a graphic over my existing UIView
我想创建一个模拟速度计的 UIView。我创建了一个新的 class SpeedometerView 并将其链接到我的主视图上的 UIView。然后使用下面的代码创建了一个类似于速度计的图像。
#import "SpeedometerView.h"
@implementation SpeedometerView
static int gX = 57;
static int gY = 180;
- (void)drawRect:(CGRect)rect
{
CGContextRef contextRef = UIGraphicsGetCurrentContext();
CGContextFillEllipseInRect(contextRef, CGRectMake(135, 105, 10, 10));
CGContextSetRGBFillColor(contextRef, 0, 0, 255, 1.0);
CGContextStrokeEllipseInRect(contextRef, CGRectMake(30, 0, 220, 220));
CGContextSetRGBFillColor(contextRef, 0, 0, 255, 1.5);
CGContextSetStrokeColorWithColor(contextRef, [[UIColor redColor] CGColor]);
CGContextSetLineWidth(contextRef, 3.0);
CGContextMoveToPoint(contextRef, 140.0, 110.0);
CGContextAddLineToPoint(contextRef, gX, gY);
CGContextDrawPath(contextRef, kCGPathStroke);
CGContextSetFillColor(contextRef, CGColorGetComponents([UIColor redColor].CGColor));
CGContextBeginPath(contextRef);
CGContextMoveToPoint(contextRef, gX, gY);
CGContextAddLineToPoint(contextRef, gX + 1, gY - 5);
CGContextAddLineToPoint(contextRef, gX + 5, gY - 1);
CGContextClosePath(contextRef);
CGContextDrawPath(contextRef, kCGPathFillStroke);
}
@end
现在的问题是我想将值传递给这个 class 以根据速度移动指针。为此,我设置了值 gX 和 gY,但我不确定如何进行。将值发送到 SpeedometerView 的代码如下,我只是不确定每次如何刷新 SpeedometerView。
-(void) updateSpeed
{
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
appDelegate.gX = 50 + resultVSC;
appDelegate.gY = 180 - resultVSC;
dispatch_async(dispatch_get_main_queue(), ^{
if (resultVSC > 0)
self.mphOutput.text = [[NSString alloc] initWithFormat:@"%d Mph", resultVSC];
//Update SpeedometerView??
[self.view setNeedsDisplay];
});
}
您需要更改 SpeedometerView 的 "gX" 和 "gY"。当你这样做时,调用 "setNeedsDisplay" 并且 drawInRect:
将被调用。关键是更改这些值,这将在绘制方法中绘制 UIView 时反映出来。
您可以实现一个 Observer 来侦听更改或使用 NSNotifications 并将速度计刷新为更新值。
使用属性而不是 static
s。
@interface SpeedometerView : ...
@property int gX = 57;
@property int gY = 180;
@end
您将可以像这样在 drawRect:
中访问这些内容:
- (void)drawRect:(CGRect)rect {
// ...
CGContextAddLineToPoint(contextRef, self.gX, self.gY);
// ...
}
您将可以像这样在 updateSpeed
中访问:
- (void)updateSpeed {
// ...
dispatch_async(dispatch_get_main_queue(), ^{
if (resultVSC > 0)
self.mphOutput.text = [[NSString alloc] initWithFormat:@"%d Mph", resultVSC];
self.view.gX = appDelegate.gX;
self.view.gY = 180 + resultVSC;
[self.view setNeedsDisplay];
});
}
我想创建一个模拟速度计的 UIView。我创建了一个新的 class SpeedometerView 并将其链接到我的主视图上的 UIView。然后使用下面的代码创建了一个类似于速度计的图像。
#import "SpeedometerView.h"
@implementation SpeedometerView
static int gX = 57;
static int gY = 180;
- (void)drawRect:(CGRect)rect
{
CGContextRef contextRef = UIGraphicsGetCurrentContext();
CGContextFillEllipseInRect(contextRef, CGRectMake(135, 105, 10, 10));
CGContextSetRGBFillColor(contextRef, 0, 0, 255, 1.0);
CGContextStrokeEllipseInRect(contextRef, CGRectMake(30, 0, 220, 220));
CGContextSetRGBFillColor(contextRef, 0, 0, 255, 1.5);
CGContextSetStrokeColorWithColor(contextRef, [[UIColor redColor] CGColor]);
CGContextSetLineWidth(contextRef, 3.0);
CGContextMoveToPoint(contextRef, 140.0, 110.0);
CGContextAddLineToPoint(contextRef, gX, gY);
CGContextDrawPath(contextRef, kCGPathStroke);
CGContextSetFillColor(contextRef, CGColorGetComponents([UIColor redColor].CGColor));
CGContextBeginPath(contextRef);
CGContextMoveToPoint(contextRef, gX, gY);
CGContextAddLineToPoint(contextRef, gX + 1, gY - 5);
CGContextAddLineToPoint(contextRef, gX + 5, gY - 1);
CGContextClosePath(contextRef);
CGContextDrawPath(contextRef, kCGPathFillStroke);
}
@end
现在的问题是我想将值传递给这个 class 以根据速度移动指针。为此,我设置了值 gX 和 gY,但我不确定如何进行。将值发送到 SpeedometerView 的代码如下,我只是不确定每次如何刷新 SpeedometerView。
-(void) updateSpeed
{
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
appDelegate.gX = 50 + resultVSC;
appDelegate.gY = 180 - resultVSC;
dispatch_async(dispatch_get_main_queue(), ^{
if (resultVSC > 0)
self.mphOutput.text = [[NSString alloc] initWithFormat:@"%d Mph", resultVSC];
//Update SpeedometerView??
[self.view setNeedsDisplay];
});
}
您需要更改 SpeedometerView 的 "gX" 和 "gY"。当你这样做时,调用 "setNeedsDisplay" 并且 drawInRect:
将被调用。关键是更改这些值,这将在绘制方法中绘制 UIView 时反映出来。
您可以实现一个 Observer 来侦听更改或使用 NSNotifications 并将速度计刷新为更新值。
使用属性而不是 static
s。
@interface SpeedometerView : ...
@property int gX = 57;
@property int gY = 180;
@end
您将可以像这样在 drawRect:
中访问这些内容:
- (void)drawRect:(CGRect)rect {
// ...
CGContextAddLineToPoint(contextRef, self.gX, self.gY);
// ...
}
您将可以像这样在 updateSpeed
中访问:
- (void)updateSpeed {
// ...
dispatch_async(dispatch_get_main_queue(), ^{
if (resultVSC > 0)
self.mphOutput.text = [[NSString alloc] initWithFormat:@"%d Mph", resultVSC];
self.view.gX = appDelegate.gX;
self.view.gY = 180 + resultVSC;
[self.view setNeedsDisplay];
});
}