[英]How to add an UIViewController's view as subview
谷歌員工請注意,這個 QA 現在已經過時了 6 年!
正如下面的 Micky 和其他人提到的,這現在每天都在 iOS 中使用容器來完成。
我有一個 ViewController 控制許多子視圖。 當我單擊其中一個按鈕時,我會初始化另一個視圖控制器並將其視圖顯示為該視圖的子視圖。 然而,子視圖超出了子視圖框架的邊界,實際上填滿了整個屏幕。
可能有什么問題? 我認為問題在於 UIViewController 的視圖有一個框架 (0,0,320,460),因此填滿了整個屏幕(盡管它僅在子視圖框架邊界內觸摸時才會接收觸摸事件)。 如何調整框架大小以適合子視圖。
簡而言之,我需要幫助將一個視圖控制器的視圖作為子視圖添加到另一個視圖控制器的視圖中。
謝謝!
從 iOS 5 開始,Apple 現在允許您制作自定義容器,以便將UIViewController添加到另一個UIViewController 中,特別是通過addChildViewController等方法,因此確實可以嵌套UIViewController
編輯:包括就地摘要以避免鏈接中斷
我引用:
iOS 提供了許多標准容器來幫助您組織應用程序。 但是,有時您需要創建與任何系統容器提供的工作流都不匹配的自定義工作流。 也許在您的願景中,您的應用程序需要一個特定的子視圖控制器組織,在它們之間具有專門的導航手勢或動畫轉換。 為此,您需要實現一個自定義容器- 告訴我更多...
...和:
當你設計一個容器時,你會在你的容器、父視圖和其他視圖控制器及其子視圖之間創建顯式的父子關系- 告訴我更多
示例(由 Apple 文檔提供)將另一個視圖控制器的視圖添加到容器的視圖層次結構
- (void) displayContentController: (UIViewController*) content
{
[self addChildViewController:content];
content.view.frame = [self frameForContentController];
[self.view addSubview:self.currentClientView];
[content didMoveToParentViewController:self];
}
感謝這些家伙,我做到了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];
享受
這個答案對於舊版本的 iOS 是正確的,但現在已經過時了。 您應該使用 Micky Duncan 的答案,其中涵蓋了自定義容器。
不要這樣做! 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:
來構建子視圖。)
我覺得所有這些答案都有些不完整,所以這是將 viewController 的視圖添加為另一個 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 使用addChild 自動調用。 謝謝@iOSSergey
當您的自定義容器調用 addChildViewController: 方法時,它會在添加之前自動調用要添加為子項的視圖控制器的 willMoveToParentViewController: 方法。
采用:
[self.view addSubview:obj.view];
改變viewcontroller.view.frame
的幀大小,然后添加到子視圖中。 [viewcontrollerparent.view addSubview:viewcontroller.view]
您可以將 PopupController 用於顯示 UIViewController 作為子視圖的 SDK 您可以檢查PopupController
這是相同的示例代碼
popup = PopupController
.create(self.navigationController!)
.customize(
[
.layout(.center),
.animation(.fadeIn),
.backgroundStyle(.blackFilter(alpha: 0.8)),
.dismissWhenTaps(true),
.scrollable(true)
]
)
.didShowHandler { popup in
}
.didCloseHandler { popup in
}
let container = MTMPlayerAndCardSelectionVC.instance()
container.closeHandler = {() in
self.popup.dismiss()
}
popup.show(container)
您必須設置邊界屬性以適合該框架。 框架其父視圖屬性,並且邊界限制視圖本身坐標系中的框架。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.