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

10-10 20:34