代码之家  ›  专栏  ›  技术社区  ›  JamesSugrue

存在XIB文件的自定义绘图

  •  3
  • JamesSugrue  · 技术社区  · 16 年前

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

    我知道如何处理未连接到NIB/XIB文件的视图

    • 将绘图代码写入 -drawRect: 方法。

    但是如果我 init 使用视图

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

    -抽签: 当然不会接到电话。我试着用下面的代码 -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);
    

    但什么都没有画出来。有什么想法吗?

    3 回复  |  直到 8 年前
        1
  •  3
  •   Chris Hanson    16 年前

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

    此外,视图并不是真正的绘图“画布”。视图将被要求绘制自己;一般来说,它不会从“外部”绘制。

    所以:

    1. 将uiviewcontroller的子类从myview重命名为myviewcontroller。

    2. 创建名为myview的新uiview子类。

    3. 添加一个 -drawRect: 方法设置为执行所需绘图的新MyView类。

    4. 最后,在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);
    }
    

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

        2
  •  3
  •   James Eichele Bernard Igiri    16 年前

    根据您的限制,这里有三种可能的解决方案。

    1. 将xib文件中nsview对象的类设置为自定义类之一。您提到您知道如何使用“硬编码”nsview子类进行自定义绘图,这将以相同的方式工作。加载XIB文件时,nsview将作为自定义类的对象而不是默认类加载到内存中。使用接口生成器更改XIB中视图的类类型很简单。
    2. 如果xib文件中的nsview对象已经是某种您不想覆盖的自定义视图,那么您可以在Interface Builder中向该视图添加一个子视图,并只需将该子视图创建为设计的自定义类(如1中所示)。
    3. 您可以在运行时以编程方式向xib文件中的nsview对象添加子视图。在上面的示例代码中,可以创建自己的自定义nsview子类的实例,然后使用 addSubView: 方法。
        3
  •  2
  •   codelogic    16 年前

    如何在一个简单的子视图中绘制所有图形并将其添加到XIB视图(在VIEWDIDLOAD中)?