Пользовательский рисунок с файлом Xib присутствует - PullRequest
3 голосов
/ 30 декабря 2008

У меня есть вид, к которому я хочу добавить собственный чертеж.

Я знаю, как сделать это с помощью View, который не подключен к файлу 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);

Но ничего не нарисовано. Есть идеи?

Ответы [ 3 ]

3 голосов
/ 30 декабря 2008

Вот три возможных решения, в зависимости от ваших ограничений.

  1. Установите класс объекта NSView в файле Xib как один из ваших пользовательских классов. Вы упоминаете, что знаете, как сделать пользовательское рисование с «жестко закодированным» подклассом NSView, и это будет работать точно так же. Когда Xib-файл загружен, NSView загружается в память как объект вашего пользовательского класса, а не по умолчанию. Изменить интерфейс класса в Xib очень просто с помощью Interface Builder.
  2. Если объект NSView в Xib-файле уже является каким-то настраиваемым представлением, которое вы не хотите переопределять, вы можете добавить подпредставление к этому представлению в Интерфейсном Разработчике и просто превратить подпредставление в пользовательский класс вашего дизайна. (как в # 1)
  3. Вы можете программно добавить подпредставление к объекту NSView в файле Xib во время выполнения. В приведенном выше примере кода вы можете создать экземпляр своего собственного пользовательского подкласса NSView, а затем добавить его в существующее представление, используя метод addSubView:.
3 голосов
/ 30 декабря 2008

Я думаю, проблема в том, что вы рассматриваете представление и его контроллер представления как взаимозаменяемые. Например, нет метода -[UIView initWithNibName:bundle:] - это метод UIViewController.

Кроме того, вид на самом деле не похож на «холст» для рисования. Представление попросят нарисовать себя; в общем, это не будет втягиваться извне.

Итак:

  1. Переименуйте свой подкласс UIViewController из MyView в MyViewController.

  2. Создайте новый подкласс UIView с именем MyView.

  3. Добавьте метод -drawRect: к вашему новому классу MyView, который делает нужный вам чертеж.

  4. Наконец, установите пользовательский класс представления вашего контроллера представления в Интерфейсном Разработчике на MyView с помощью Identity Inspector.

Например, вы должны иметь возможность использовать это для вашей -[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 голосов
/ 30 декабря 2008

Как насчет рисования всего в простом подпредставлении и добавления его в представление XIB (в viewDidLoad)?

...