7

我有一个 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

画圈.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,views 自定义类是DrawCircle。

**编辑:**我还想提一下,在我的 DrawCircle.m 中,我有从 MapViewController.m 调用的方法并且正在运行。

还。最初,正在调用 DrawRect 方法,但我无法使用setNeedsUpdate. 调试的时候连DrawRect方法都没有进入。

4

1 回答 1

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);
}

这样,圆圈的位置和大小将由frameI 为圆圈设置(顺便说一下,如果这使它更加混乱,我深表歉意,但我使用不同的类名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];
}
于 2013-05-01T03:45:38.147 回答