Поскольку ваш контроллер представления, по-видимому, управляется контроллером навигации, вызов [self.view.superview addSubview:datePopup];
добавляет ваше всплывающее окно как подпредставление UIViewControllerWrapperView
, которое является одним из частных классов, используемых UIKit для реализации функциональности UINavigationController
.Возиться с частной иерархией представления UIKit всегда рискованно.В этом случае, исходя из поведения, которое вы видите, кажется, что UIKit ожидает, что любое подпредставление UIViewControllerWrapperView
будет представлением контроллера представления, поэтому оно соответствующим образом изменяет размер вашего всплывающего окна.
Я думаю, что самый безопасный способЧтобы решить эту проблему, нужно, чтобы представление вашего контроллера представления было оболочкой, содержащей ваш tableView и, при необходимости, ваше всплывающее представление.К сожалению, использование представления-оболочки означает, что контроллер представления не может быть UITableViewController
.Вам придется изменить суперкласс на UIViewController
, установить пользовательское свойство tableView
и вручную принять протоколы UITableViewDataSource
и UITableViewDelegate
.
Примечание: у вас может возникнуть желание добавить свой поповеркак подпредставление вашего окна, но я не рекомендую этого, потому что UIWindow
только автоматически поворачивает свое самое верхнее подпредставление, соответствующее контроллеру представления.Это означает, что если вы добавите всплывающее окно в окно, оно не будет автоматически поворачиваться.
РЕДАКТИРОВАТЬ: Кстати, переназначая self = [xib objectAtIndex:0];
в initWithFrame:
, вы вытекаете объект, который был первоначальноalloc'd.Если вы собираетесь переназначить себя таким образом, сначала вы должны освободить существующий объект.