Как добавить представление UIViewController в качестве подзадачи
Примечание для гуглеров, этот Q-A теперь истекает на шесть лет!
Как упоминает Микки ниже и другие, это делается на ежедневной основе с помощью Контейнеров в iOS.
У меня есть ViewController, который контролирует многие подзаголовки. Когда я нажимаю одну из кнопок, я инициализирую другой диспетчер представлений и показываю его как подпункт этого представления. Однако subview превышает границы кадра для subview, а infact заполняет весь экран.
Что может быть неправильным? Я предполагаю, что проблема заключается в том, что представление UIViewController имеет фрейм (0,0,320,460) и, следовательно, заполняет весь экран (хотя он получает события касания только при касании в границах рамки подсмотра). Как изменить размер рамки в соответствии с подвью.
Вкратце, мне нужна помощь в добавлении представления viewcontroller в качестве подчиненного представления в другое представление viewcontroller.
Спасибо!
Ответы
Ответ 1
Начиная с iOS 5, Apple теперь позволяет вам делать пользовательские контейнеры с целью добавления UIViewController к другому UIViewController, особенно с помощью таких методов, как addChildViewController, так что действительно возможно вложить UIViewControllers
РЕДАКТИРОВАТЬ: Включая резюме на месте, чтобы избежать разрыва связи
Я цитирую:
iOS предоставляет множество стандартных контейнеров, которые помогут вам организовать ваши приложения. Однако иногда вам нужно создать собственный рабочий процесс, который не соответствует тому, который предоставляется в любом из системных контейнеров. Возможно, в вашем видении ваше приложение нуждается в определенной организации контроллеров детского просмотра со специальными движениями навигации или переходами между ними. Для этого вы реализуете пользовательский контейнер - Скажите подробнее...
... и:
При создании контейнера вы создаете явные отношения между родителями и дочерними элементами между вашим контейнером, родительским и другими контроллерами представлений, его дочерние элементы - Скажите мне больше
Пример (любезно предоставлен документацией Apple) Добавление другого представления контроллеров в иерархию представлений контейнеров
- (void) displayContentController: (UIViewController*) content
{
[self addChildViewController:content];
content.view.frame = [self frameForContentController];
[self.view addSubview:self.currentClientView];
[content didMoveToParentViewController:self];
}
Приветствия,
Микки Дункан
Ответ 2
Благодаря этим парням я сделал это http://highoncoding.com/Articles/848_Creating_iPad_Dashboard_Using_UIViewController_Containment.aspx
Добавьте UIView, подключите его к заголовку:
@property (weak, nonatomic) IBOutlet UIView *addViewToAddPlot;
В - (void) viewDidLoad выполните следующее:
ViewControllerToAdd *nonSystemsController = [[ViewControllerToAdd alloc] initWithNibName:@"ViewControllerToAdd" bundle:nil];
nonSystemsController.view.frame = self.addViewToAddPlot.bounds;
[self.addViewToAddPlot addSubview:nonSystemsController.view];
[self addChildViewController:nonSystemsController];
[nonSystemsController didMoveToParentViewController:self];
Enjoy
Ответ 3
Этот ответ верен для старых версий iOS, но теперь он устарел. Вы должны использовать ответ Микки Дункана, который охватывает пользовательские контейнеры.
Не делай этого! Цель UIViewController
- управлять всем экраном. Это просто не подходит для этого, и на самом деле это не добавляет ничего, что вам нужно.
Все, что вам нужно, это объект, которому принадлежит пользовательский вид. Просто используйте подкласс самого UIView
, поэтому его можно добавить в вашу иерархию окон, а управление памятью полностью автоматическое.
Направьте подчиненному владельцу NIB пользовательский подкласс UIView
. Добавьте выход contentView
к этому пользовательскому подклассу и наведите его на представление внутри наконечника. В пользовательском подклассе сделайте что-то вроде этого:
- (id)initWithFrame: (CGRect)inFrame;
{
if ( (self = [super initWithFrame: inFrame]) ) {
[[NSBundle mainBundle] loadNibNamed: @"NibNameHere"
owner: self
options: nil];
contentView.size = inFrame.size;
// do extra loading here
[self addSubview: contentView];
}
return self;
}
- (void)dealloc;
{
self.contentView = nil;
// additional release here
[super dealloc];
}
(Я предполагаю, что вы используете initWithFrame:
для построения подвью.)
Ответ 4
Я чувствую, что все эти ответы немного неполны, поэтому здесь правильный способ добавления viewController view в качестве подзапроса другого представления viewController:
[self addChildViewController:viewControllerToAdd];
[self.view addSubview:viewControllerToAdd.view];
[viewControllerToAdd didMoveToParentViewController:self];
Если вы хотите, вы можете скопировать его в свой код в виде фрагмента. SO, похоже, не понимает форматирование замены кода, но они будут отображаться в Xcode:
[self addChildViewController:<#viewControllerToAdd#>];
[self.view addSubview:<#viewControllerToAdd#>.view];
[<#viewControllerToAdd#> didMoveToParentViewController:self];
willMove вызывается автоматически w/addChild. Спасибо @iOSSergey
Когда ваш пользовательский контейнер вызывает метод addChildViewController: он автоматически вызывает метод willMoveToParentViewController: метод контроллера представления, который будет добавлен в качестве дочернего элемента, прежде чем добавлять его.
Ответ 5
Использование:
[self.view addSubview:obj.view];
Ответ 6
Измените размер кадра viewcontroller.view.frame
, а затем добавьте в subview. [viewcontrollerparent.view addSubview:viewcontroller.view]
Ответ 7
Вы должны установить свойства границ для этого фрейма. кадр его свойств супервизора, а границы ограничивают рамку в самой системе координат представления.