Пользовательский чертеж с присутствующим файлом Xib

StackOverflow https://stackoverflow.com/questions/398806

  •  29-08-2019
  •  | 
  •  

Вопрос

У меня есть представление, к которому я хочу добавить какой-нибудь пользовательский рисунок.

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

Но ничего не получается нарисовать.Есть какие-нибудь идеи?

Это было полезно?

Решение

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

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

Итак:

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

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

  3. Добавить a -drawRect: метод для вашего нового класса MyView, который выполняет рисование, которое вы хотите.

  4. Наконец, установите пользовательский класс представления вашего view controller в Interface Builder на 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);
}

Рисунок будет обрезан до переданного прямоугольника обновления.

Другие советы

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

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

Как насчет того, чтобы сделать весь чертеж в простом подвиде и добавить его в XIB view (в viewDidLoad)?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top