Простой UIView drawRect не вызывается - PullRequest
6 голосов
/ 08 июня 2011

Я не могу понять, в чем здесь проблема. У меня есть очень простой UIViewController с очень простым методом viewDidLoad:

-(void)viewDidLoad {

    NSLog(@"making game view");
    GameView *v = [[GameView alloc] initWithFrame:CGRectMake(0,0,320,460)];

    [self.view addSubview:v];

    [super viewDidLoad];
}

И мой GameView инициализируется следующим образом:

@interface GameView : UIView {

и у него просто есть новый метод drawRect:

- (void)drawRect:(CGRect)rect
{

    [super drawRect:rect];

    NSLog(@"drawing");
}

В консоли я вижу, как печатается «создание игрового вида», но «рисунок» никогда не печатается. Зачем? Почему не вызывается мой метод drawRect в моем пользовательском UIView. Я буквально просто пытаюсь нарисовать круг на экране.

Ответы [ 4 ]

12 голосов
/ 08 июня 2011

Вы пытались указать кадр в инициализации представления?Поскольку вы создаете пользовательский UIView, вам нужно указать рамку для вида перед вызовом метода рисования.

Попробуйте изменить свой viewDidLoad на следующее:

NSLog(@"making game view");
GameView *v = [[GameView alloc] initWithFrame:CGRectMake(0,0,320,460)];


if (v == nil)
    NSLog(@"was not allocated and/or initialized");

[self.view addSubview:v];

if (v.superview == nil)
    NSLog(@"was not added to view");

[super viewDidLoad];

дайте мне знатьчто вы получаете.

0 голосов
/ 14 мая 2015

У меня было представление, которое было за кадром, что я загружаю на экране, а затем перерисовываю.Однако при очистке ограничений автоматического макета в XCode было решено, что мое внеэкранное представление должно иметь рамку (0,0,0,0) (x, y, w, h).А с размером (0,0) представление никогда не загрузится.

Убедитесь, что у NSView размер кадра не равен нулю, иначе drawRect не будет вызываться.

0 голосов
/ 23 декабря 2014

Если вы используете библиотеку или файл CocoaTouch, вам может потребоваться переопределить метод initWithCoder вместо viewDidLoad.

Объектив-C:

- (instancetype)initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:coder];
    if (self) {
        //Do Stuff Here
    }
    return self;
}
0 голосов
/ 31 октября 2013

Проверьте, отображается ли ваш вид.Если представление в данный момент не отображается на экране, drawRect не будет вызываться, даже если вы добавите представление к его суперпредставлению.Возможно, ваше представление заблокировано каким-либо другим представлением.

И, насколько я знаю, вам не нужно писать [super drawRect];

Обратите внимание, что даже если viewDidLoad вызывается на контроллере вида, это не обязательно означает, что вид контроллера вида отображается на экране.Пример: Предположим, что контроллер представления A имеет ивар, в котором хранится контроллер представления B, и в данный момент отображается представление контроллера A просмотра.Также предположим, что B выделен и инициирован.Теперь, если какой-то метод в A вызывает доступ к представлению B, viewDidLoad в B будет вызван в результате независимо от того, отображается ли он.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...