UITextField не отображается при добавлении в качестве подпредставления - PullRequest
0 голосов
/ 31 августа 2010

Я делаю приложение OpenGL ES и пытаюсь понять, как включить части графического интерфейса UIKit поверх представления с работающим над ним OpenGL ES.

В методе initкласс EAGLView У меня есть это для установки UITextField:

add_name_field = [[UITextField alloc] initWithFrame: CGRectMake(10, 10, [UIScreen mainScreen].bounds.size.width, 50)];

Где-то в методе drawRect, где все отображается и обрабатывается для игры, которую я имею:

[add_name_field becomeFirstResponder];
[self insertSubview: add_name_field atIndex:0];

Я могу подтвердить, что этот код вызывается, потому что я использовал NSLog, чтобы проверить это, но когда он запущен, текстовое поле не отображается поверх представления OpenGL игры.Если я добавлю код в метод init, текстовое поле будет отображаться правильно с клавиатурой в начале игры.

Так как мне заставить его работать в методе drawRect?

Спасибо за любой ответ.Тем временем я напишу некоторый код для делегата.

Ответы [ 4 ]

2 голосов
/ 31 августа 2010

Спасибо за все остальные ответы, но я нашел решение.

Это было простое решение. Я просто переместил метод addSubView в инициализацию класса EAGLView. Клавиатура не будет отображаться, пока я не сделаю текстовое поле первым респондентом. Закончив с этим, я могу просто очистить текст и снова сделать класс EAGLView первым респондентом, и все это снова скрывается.

Таким образом, я могу просто использовать клавиатуру для ввода текста в моей игре, отображать текст при наборе текста и скрывать его впоследствии.

1 голос
/ 31 августа 2010

Добавьте текстовое подпредставление за пределами drawRect. drawRect предназначен для рендеринга этого одного вида и может игнорировать или не игнорировать рисование любых других видов (например, вашего текстового представления) в зависимости от способа отображения стека представлений.

1 голос
/ 31 августа 2010

Я предполагаю, что вы находитесь в подклассе UIViewController, с кодом выше?Если это так, то вместо

[self insertSubview: add_name_field atIndex:0];

do:

[self.view addSubview:add_name_field];

Важная часть заключается в том, что вы вызываете этот метод на self.view, а не self.Добавление подпредставлений - это функция VIEW, а не функция View CONTROLLER.

insertSubview:atIndex: тоже должно работать (если вызывается для нужного объекта), но addSubview: прикрепит ее поверх вида независимо от того, чтоеще есть, так что это немного чище.

0 голосов
/ 31 августа 2010

Есть ли причина сделать это в методе drawRect? Вы сказали, что он хорошо работает в методе init, так почему бы его там не было?

Что касается того, почему это не работает, я точно не знаю представления OpenGL, но, предполагая, что они работают так же, как обычные UIViews, вам, вероятно, не следует добавлять другие UIViews в функцию drawRect. UIViews не отображаются и рисуются сразу; они должны ждать, пока рулевой кончик скажет им рисовать. Вероятно, случается так, что когда drawRect вашего суперпредставления заканчивается, он предполагает, что все его подпредставления закончили рисование, и не понимает, что у вашего недавно добавленного текстового поля не было шанса. То, что вы можете попробовать, это вызвать setNeedsDisplay для вашего текстового поля.

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