在 UIViewController 的主视图中加载自定义 UIView
Posted
技术标签:
【中文标题】在 UIViewController 的主视图中加载自定义 UIView【英文标题】:Loading custom UIView in UIViewController's main view 【发布时间】:2010-11-25 21:25:07 【问题描述】:我将 UIView 子类化并创建了一个 NIB 来控制我的应用程序的主要逻辑。
希望视图能够很好地缩放,我想将它用于 iPhone 和 iPad 版本的应用程序。
在 iPhone 上,视图将覆盖整个屏幕。在 iPad 上,视图将仅覆盖屏幕的一部分。
我读到你不应该使用 UIViewControllers 来控制屏幕的一部分。因此,我正在尝试使用 IB 将自定义 UIView 嵌入到主 UIViewController 的视图中。
如何做到这一点?
【问题讨论】:
【参考方案1】:经过大量试验和错误,我找到了一个基于以下question 中解释的方法的解决方案,由Brian Webster 回答。
该解决方案最初建议用于 Cocoa 环境。我希望它在 ios 环境中也有效。
-
使用 NIB 文件创建主视图控制器。在 NIB 中,File's Owner 应该对应于您的主视图控制器的类。
使用 NIB 文件创建自定义视图控制器。在此 NIB 中,File's Owner 应与您的自定义视图控制器的类相对应。
在主视图控制器类中创建自定义视图控制器属性。
在主视图控制器类中创建一个 UIView 属性。它将保存您的自定义视图控制器的视图。将其定义为 IBOutlet,以便在 NIB 中链接。
在主视图控制器的 NIB 中放置一个 UIView。将其链接到主视图控制器的视图 IBOutlet。它将用作自定义视图的占位符。
在主视图控制器的 viewDidLoad 方法中,加载自定义视图控制器的 NIB,确定自定义视图的帧大小并将视图复制到主视图控制器的视图中。
这是一些代码:
MainViewController.h
@interface MainViewController : UIViewController
CustomViewController *customViewController;
UIView *customView;
@property (nonatomic, retain) CustomViewController *customViewController;
@property (nonatomic, retain) IBOutlet UIView *customView;
@end
MainViewController.m
- (void)viewDidLoad
CustomViewController *controller = [[CustomViewController alloc] initWithNibName:@"CustomViewController" bundle:nil];
self.customViewController = controller;
[controller release];
customViewController.view.frame = customView.frame;
customViewController.view.autoresizingMask = customView.autoresizingMask;
[customView removeFromSuperview];
[self.view addSubview:customViewController.view];
self.customView = customViewController.view;
[super viewDidLoad];
【讨论】:
【参考方案2】:-
将您的自定义 UIView 的
IBOutlet
属性添加到 UIViewController,并为您希望访问的任何子视图添加其他插座。
转到 Interface Builder,在您的 NIB 中选择“File's Owner”对象,然后在 Inspector 中转到最右侧的选项卡,设置其类以匹配您的 UIViewController 的类。
将“文件所有者”第一步中的 IBOutlet 连接到您的自定义 UIView。
在 XCode 中,当您需要加载视图时,请执行以下操作:
--
[[NSBundle mainBundle] loadNibNamed:@"MyNib" owner:self options:0];
self.myCustomView.frame=self.view.bounds; // make view fill screen - customize as necessary
[self.view addSubview:self.myCustomView];
当您加载 NIB 时,您在第 1 步中设置的插座将填充从您的 NIB 加载的对象。
【讨论】:
尝试了您的建议,但没有成功。我已经调整了我原来的问题来反映这一点。还有什么想法吗? 提出了我自己的解决方案并编辑了原始问题。 没有 Interface Builder 怎么办? 当我们在xib中添加了customview,为什么还要添加using [self.view addSubview:self.myCustomView]?以上是关于在 UIViewController 的主视图中加载自定义 UIView的主要内容,如果未能解决你的问题,请参考以下文章
在 UIScrollView Swift3 中加载 UIViewController