我有一个viewController,它显然是UIViewController
的子类,称为MapViewController
。在此viewController中,我使用GPS获取用户的位置。
我也有一个名为DrawCircle
的 View 。此 View 是UIView
的子类。
我希望可以使用drawCircle随时在我的MapViewController上进行绘制。但是我不确定我是否理解这样做的概念。我知道我的绘图代码可以正常工作,我之前已经使用过。但是我不知道如何使用MapViewController
绘制DrawCircle
。
从我看来,每当我调用[myCustomView setNeedsDisplay]
时,它都没有在我的 View 中调用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,而 View 自定义类是DrawCircle。
**编辑:**我还想提到,在我的DrawCircle.m中,我有一些从MapViewController.m调用的方法并且正在工作。
还。最初,正在调用DrawRect方法,但是我无法使用
setNeedsUpdate
手动调用。调试时,它甚至没有输入DrawRect方法。 最佳答案
您正在创建DrawCircle,但从未将其添加到 View 中,例如
[self.view addSubview:circleView];
因此,它不在范围内,并且(如果使用ARC)会在您身上发布。您似乎也没有设置其
frame
,例如:circleView = [[DrawCircle alloc] initWithFrame:self.view.bounds];
或者,您可以在界面构建器中添加 View (标准
UIView
,然后直接在IB中指定自定义类)。另外,请注意,您通常甚至都不会调用
setNeedsDisplay
。将其添加到 View 层次结构将为您调用此方法。仅在需要基于某些自定义属性更新 View 时,才需要调用此方法。就个人而言,我倾向于像这样定义
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];
}
关于ios - setNeedsDisplay不触发DrawRect,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16312168/