3

我有一个要添加一些自定义绘图的视图。

我知道如何使用未连接到 Nib/Xib 文件的视图来执行此操作

  • 您在方法中编写绘图代码-drawRect:

但是如果我init使用的视图

[[MyView alloc] initWithNibName:@"MyView" bundle:[NSBundle mainBundle]];

-drawRect:当然不会被调用。我试着做下面的代码-viewDidLoad

CGRect rect = [[self view] bounds];

CGContextRef ref = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(ref, 2.0);
CGContextSetRGBStrokeColor(ref, 1.0, 1.0, 1.0, 1.0);
CGContextSetRGBFillColor(ref, 0, 0, 0, 0);
CGContextAddRect(ref, CGRectMake(1, 1, rect.size.width - 10, rect.size.height - 10));
CGContextStrokePath(ref);
CGContextDrawPath(ref, kCGPathFillStroke);

但是什么都画不出来。有任何想法吗?

4

3 回答 3

3

以下是三种可能的解决方案,具体取决于您的限制。

  1. 将 Xib 文件中的 NSView 对象的类设置为您的自定义类之一。您提到您知道如何使用“硬编码” NSView 子类进行自定义绘图,这将以相同的方式工作。加载 Xib 文件时,NSView 作为自定义类的对象而不是默认值加载到内存中。使用 Interface Builder 在 Xib 中更改视图的类类型很简单。
  2. 如果 Xib 文件中的 NSView 对象已经是某种您不想覆盖的自定义视图,您可以在 Interface Builder 中向该视图添加一个子视图,并简单地将子视图变成您设计的自定义类(如#1)
  3. 您可以在运行时以编程方式将子视图添加到 Xib 文件中的 NSView 对象。在上面的示例代码中,您可以创建自己的自定义 NSView 子类的实例,然后使用该addSubView:方法将其添加到现有视图中。
于 2008-12-29T23:09:18.997 回答
3

我认为问题在于您将视图及其视图控制器视为可互换的。例如,没有-[UIView initWithNibName:bundle:]方法——那是 UIViewController 方法。

此外,视图并不像用于绘图的“画布”。将要求视图自行绘制;一般不会从“外”拉进来。

所以:

  1. 将 UIViewController 的子类从 MyView 重命名为 MyViewController。

  2. 创建一个名为 MyView 的新 UIView 子类。

  3. 向您的新 MyView 类添加一个-drawRect:方法来执行您想要的绘图。

  4. 最后,使用 Identity Inspector 将 Interface Builder 中视图控制器视图的自定义类设置为 MyView。

例如,您应该能够将其用于您的-[MyView drawRect:]实现:

- (void)drawRect:(CGRect)rect {
    CGRect bounds = [[self view] bounds];

    CGContextRef ref = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(ref, 2.0);
    CGContextSetRGBStrokeColor(ref, 1.0, 1.0, 1.0, 1.0);
    CGContextSetRGBFillColor(ref, 0, 0, 0, 0);
    CGContextAddRect(ref, CGRectMake(1, 1, bounds.size.width - 10, bounds.size.height - 10));
    CGContextStrokePath(ref);
    CGContextDrawPath(ref, kCGPathFillStroke);
}

绘图将被剪裁到传入的更新矩形。

于 2008-12-30T00:44:02.720 回答
2

在一个简单的子视图中完成所有绘图并将其添加到 XIB 视图(在 viewDidLoad 中)怎么样?

于 2008-12-29T23:05:45.773 回答