我有一个viewController,它显然是UIViewController
的一个子类MapViewController
。在这个viewController中,我使用GPS来获取用户的位置。
我还有一个名为DrawCircle
的视图。该视图是UIView
。
使用drawCircle我希望能够随时在我的MapViewController上绘图。但我不确定我是否理解这样做的概念。我知道我的绘图代码正在运行,我之前使用过它。但我不知道如何使用MapViewController
来吸引DrawCircle
。
在我致电[myCustomView setNeedsDisplay]
时,看起来似乎是我所看到的,而不是在我的视图中调用DrawRect
方法。
这是一些代码: 的 MapViewController.h
#import "DrawCircle.h"
@interface MapViewController: UIViewController <CLLocationManagerDelegate>{
DrawCircle *circleView;
}
@property (nonatomic, retain) DrawCircle *circleView;
@end
MapViewController.m
#import "DrawCircle.h"
@interface MapViewController ()
@end
@implementation MapViewController
@synthesize circleView;
- (void) viewDidLoad
{
circleView = [[DrawCircle alloc] init];
[self setNeedsDisplay];
[super viewDidLoad];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
@end
DrawCircle.m
#import "DrawCircle.h"
@interface DrawCircle()
@end
@implementation DrawCircle
-(id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if(self) {
}
return self;
}
- (void)drawRect:(CGRect)rect
{
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGPoint point = CGPointMake(40, 137);
CGContextAddEllipseInRect(ctx, CGRectMake(point.x, point.y, 10, 10));
}
CGContextSetFillColor(ctx, CGColorGetComponents([[UIColor redColor] CGColor]));
CGContextFillPath(ctx);
}
此外,如果这为我的思考过程提供了任何帮助,这里是我的StoryBoard场景。
viewcontrollers自定义类是MapViewController,视图自定义类是DrawCircle。
**编辑:**我还想提一下,在我的DrawCircle.m中,我有从MapViewController.m调用的方法并且正在工作。
另外。最初,正在调用DrawRect方法,但我无法使用setNeedsUpdate
手动调用。在调试时,它甚至没有进入DrawRect方法。
答案 0 :(得分:5)
您正在创建DrawCircle,但您永远不会将其添加到视图中,例如
[self.view addSubview:circleView];
因此,它超出了范围,并且(如果使用ARC)获得释放。您似乎也没有设置其frame
,例如:
circleView = [[DrawCircle alloc] initWithFrame:self.view.bounds];
或者,您可以在界面构建器中添加视图(标准UIView
,但在IB中指定您的自定义类)。
另外,请注意,您通常甚至不会致电setNeedsDisplay
。将其添加到视图层次结构将为您调用此方法。如果需要根据某些自定义属性更新视图,则只需调用此方法。
就个人而言,我倾向于如此定义drawRect
:
- (void)drawRect:(CGRect)rect
{
CGContextRef ctx = UIGraphicsGetCurrentContext();
// I'd just use `rect` and I can then use the `frame` to coordinate location and size of the circle
CGContextAddEllipseInRect(ctx, rect);
// perhaps slightly simpler way of setting the color
CGContextSetFillColorWithColor(ctx, [[UIColor redColor] CGColor]);
CGContextFillPath(ctx);
}
这样,圆圈的位置和大小将由我为圆圈设置的frame
决定(顺便说一下,如果这让它更加混乱,我道歉,但我使用了不同的类名, CircleView
,因为我希望View
子类的名称中包含UIView
。
- (void)viewDidLoad
{
[super viewDidLoad];
UIView *circle;
circle = [[CircleView alloc] initWithFrame:CGRectMake(100.0, 100.0, 200.0, 200.0)];
circle.backgroundColor = [UIColor clearColor]; // because it calls `super drawRect` I can now enjoy standard UIView features like this
[self.view addSubview:circle];
circle = [[CircleView alloc] initWithFrame:CGRectMake(300.0, 300.0, 10.0, 10.0)];
circle.backgroundColor = [UIColor blackColor]; // because it calls `super drawRect` I can now enjoy standard UIView features like this
[self.view addSubview:circle];
}