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 加载时移动?的主要内容,如果未能解决你的问题,请参考以下文章

使用一个 xib 在加载时加载正确的方向 UIView 问题

从 xib 加载子类时如何设置子类 UIView 属性的值

从 XIB 加载 UIView 大小不正确

从 UIView 加载 UINavigation 控制器

UIView:从自定义 XIB 加载导致崩溃

使用 XIB 加载的 UIView 按钮不起作用