xib指定的位置在UIView加载时移动?

时间:2010-09-29 14:09:34

标签: iphone cocoa-touch uiview uiviewcontroller xib

我有几个视图控制器,我希望所有人共享一个标题状态栏。此标题视图显示我的应用中某些内容的状态。我使用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这样做。

2 个答案:

答案 0 :(得分:1)

您是否在IB中更改了子视图的位置?通常,视图的默认位置(0,0)将是屏幕中大视图的(顶部,左侧)坐标。我认为检查一切正常

答案 1 :(得分:0)

通过以编程方式指定子视图的框架,您可以在不使用“占位符”视图的情况下执行此操作:

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];