xib 指定的位置在 UIView 加载时移动?
Posted
技术标签:
【中文标题】xib 指定的位置在 UIView 加载时移动?【英文标题】:xib-specified location moves on UIView load? 【发布时间】:2010-09-29 14:09:33 【问题描述】:我有几个视图控制器,我希望它们都共享一个标题状态栏。此标题视图显示我的应用程序中某些事物的状态。我使用 IB 在其自己的 xib 中布局标题视图的内容,然后还使用 IB 布局视图控制器,在视图控制器的 xib 中添加一个占位符 UIView 元素,以供我以编程方式加载标题时使用。
现在,当我从视图 xib 的内容创建 UIView 子类并将其作为子视图添加到我的任何视图控制器的视图时,我在视图控制器 xib 中为标题视图指定的位置似乎被忽略,并且标题视图无论如何都会放置在(0,0)。标题视图的所有内容都加载并显示正常,只是视图控制器中标题视图的位置错误。
这是我如何加载标题视图并将其添加到我的视图控制器:
header = [InfoHeader loadFromNib:MY_NIB_NAME withOwner:self];
[self.view addSubview:header];
确认视图控制器 xib 有一个连接到“header”变量的出口。这是'loadFromNib'方法:
+(InfoHeader *) loadFromNib: (NSString *) nibName withOwner:(id) objectOwner
NSBundle *b = [NSBundle mainBundle];
NSArray *nib = [b loadNibNamed:nibName owner:objectOwner options:nil];
InfoHeader *header;
for (id obj in nib)
if ([obj isKindOfClass:[InfoHeader class]])
header = (InfoHeader *) obj;
return header;
关于在这里检查什么有什么想法吗?我宁愿不以编程方式定位标题栏,而是让 IB 来做。
【问题讨论】:
【参考方案1】:您是否更改了 IB 中子视图的位置?通常,视图的默认位置 (0, 0) 将是屏幕中大视图的(上、左)坐标。我认为检查会很好
【讨论】:
是的,我的子视图在 IB 中从顶部向下 44 像素。但是,无论我将 UIView 放在 IB 中的哪个位置,显示的视图都会显示在 (0,0) 处。 等等,你的标题视图只是一个视图,你怎么能把它在 IB 中从顶部向下 44 像素?老实说,我不明白你在 IB 中的布局 是的,我的标题视图只是我的视图控制器主视图中的一个视图。视图控制器具有全屏视图,然后我在该视图中放置了一个较小的视图(用于我的标题)。无论我将该 UIView 项放在 IB 中的何处(顶部、底部、任何位置),它都会在我运行时显示在顶部。 我认为你做错了。你已经把header放到了IB里了,为什么还要addSubview呢。您是否将标题视图与 nib 文件视图连接起来? 这里出了点问题:当你调用 add subview: 时,你的 header 将从 header nib 加载,并且在那里,它有不同的位置。 ViewController 的 nib 文件包含较小的视图。如果你想让它发生,你需要打电话给[self.yourPlacedHolderView addSubview:headerView];
【参考方案2】:
您可以通过以编程方式指定子视图的框架来完成此操作,而无需使用“占位符”视图:
InfoHeader *header = [InfoHeader loadFromNib:MY_NIB_NAME withOwner:self];
header.frame = CGRectMake(0, 44, header.frame.size.width, header.frame.size.height);
[self.view addSubview:header];
(该代码假定您已从类中删除了 header
出口,因此它可以改为局部变量)。
或者,如果您更愿意使用占位符(这样您可以使用 IB 而不是以编程方式指定标题的位置),请这样做:
InfoHeader *headerView = [InfoHeader loadFromNib:MY_NIB_NAME withOwner:self];
[header addSubview:headerView];
【讨论】:
以上是关于xib 指定的位置在 UIView 加载时移动?的主要内容,如果未能解决你的问题,请参考以下文章