gpt4 book ai didi

objective-c - 如何使用 drawRect 在现有 View 中绘制?

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:34:11 26 4
gpt4 key购买 nike

我正在做一个 GPS 跟踪应用程序。每次它收到纬度/经度时,它都会将其转换为 (x,y) 坐标并调用 drawRect 在两个 (x,y) 对之间画一条线。

然而,drawRect 方法只是在绘制新内容之前清除所有旧内容。如何使 drawRect 在现有 Canvas 上绘制新内容?提前致谢

这是我的 viewController.h

#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>

@class routetrack;

@interface simpleDrawViewController : UIViewController <CLLocationManagerDelegate> {

CLLocationManager *locationManager;
IBOutlet routetrack *routeroute;

float latOld;
float longOld;
float latNew;
float longNew;
}

- (IBAction) gpsValueChanged;

@property (nonatomic,retain) CLLocationManager *locationManager;
@property (retain,nonatomic) routetrack *routeroute;

ViewController.m

#import "simpleDrawViewController.h"
#import "routetrack.h"

@implementation simpleDrawViewController
@synthesize locationManager,btn,routeroute;

- (IBAction) gpsValueChanged{

[routeroute setLocationX:longNew setLocationY:latNew
oldLocation:longOld oldLocationY:latOld ];
[routeroute setNeedsDisplay];

}


- (void)viewDidLoad {
[super viewDidLoad];

if (nil == locationManager)
locationManager = [[CLLocationManager alloc] init];

locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;

[locationManager startUpdatingLocation];
}



- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}


- (void) locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
if (oldLocation) {

latOld=oldLocation.coordinate.latitude;
longOld=oldLocation.coordinate.longitude;
latNew=newLocation.coordinate.latitude;
longNew=newLocation.coordinate.longitude;
}

else {
latOld=53.3834;
longOld=-6.5876;
latNew=53.3835;
longNew=-6.5877;
}

[self gpsValueChanged];

}



- (void) locationManager:(CLLocationManager *)manager didFailwithError:
(NSError *)error
{
if([error code] == kCLErrorDenied)
[locationManager stopUpdatingLocation];

NSLog(@"location manger failed");
}




- (void)dealloc {
[locationManager release];
[super dealloc];
}

@end

我的绘图类,UIView的子类

#import "routetrack.h"


@implementation routetrack



- (void) setLocationX:(float) loX setLocationY:(float) loY
oldLocation:(float) oldX oldLocationY:(float) oldY {


self->locationX = loX;
self->locationY = loY;
self->oldLoX = oldX;
self->oldLoY = oldY;

scaleX= 36365.484375;
scaleY= 99988.593750;
maxLat= 53.3834;
maxLog= -6.5976;

drawX = locationX;
drawY = locationY;

tempX=(maxLog - drawX) * scaleX;
tempY=(maxLat - drawY) * scaleY;

lastX = (int) tempX;
lastY = (int) tempY;

drawX = oldLoX;
drawY = oldLoY;

tempX=(maxLog - drawX) * scaleX;
tempY=(maxLat - drawY) * scaleY;

startX = (int) tempX;
startY = (int) tempY;


}

- (id)initWithFrame:(CGRect)frame {

self = [super initWithFrame:frame];
if (self) {
}
return self;

}


- (void)drawRect:(CGRect)rect {

int firstPointX = self->startX;
int firstPointY = self->startY;
int lastPointX = self->lastX;
int lastPointY = self->lastY;

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetRGBStrokeColor(context, 1.0, 0.0, 0.0, 1.0);
CGContextSetLineWidth(context, 2.0);

CGContextMoveToPoint(context, firstPointX, firstPointY);

CGContextAddLineToPoint(context, lastPointX , lastPointY);

CGContextStrokePath(context);

}

最佳答案

UIView 没有 Canvas 模型。如果你想保留一个 Canvas ,你应该创建一个 CGLayer 或一个 CGBitmapContext 并在上面绘制。然后在您的 View 中绘制它。

我会为 CGLayerRef 创建一个 ivar,然后 drawRect: 看起来像这样(未经测试):

- (void)drawRect:(CGRect)rect {
if (self.cgLayer == NULL) {
CGLayerRef layer = CGLayerCreateWithContext(UIGraphicsContextGetCurrent(), self.bounds, NULL);
self.cgLayer = layer;
CGLayerRelease(layer);
}

... various Core Graphics calls with self.cgLayer as the context ...

CGContextDrawLayerInRect(UIGraphicsContextGetCurrent(), self.bounds, self.cgLayer);
}

每当您想清除 Canvas 时,只需self.cgLayer = NULL

setCgLayer: 会是这样的:

- (void)setCgLayer:(CGLayerRef)aLayer {
CGLayerRetain(aLayer);
CGLayerRelease(cgLayer_);
cgLayer_ = aLayer;
}

关于objective-c - 如何使用 drawRect 在现有 View 中绘制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6724800/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com