更改视图会将它们重新定位在(0,0)

时间:2013-05-09 10:31:27

标签: objective-c cocoa nsview

我创建了一个简单的窗口,其目的就像是“向导”(我知道Apple指南基本上禁止你,我试图说服客户,但无论如何。

这只是一个简单的视图,里面有两个自定义视图,一个在底部,包含一个“上一个”和“下一个”按钮,一个更大的视图在顶部占用了大部分空间。

我调用了底部视图“NavigationView”和顶部的“ContainerView”。

我创建了一个数组来保存用户应该使用“下一个”和“上一个”按钮导航的一系列视图。

所以,这是我的代码。

- (IBAction) next:(id)sender{
    currentViewIndex++;
    [self animatePushView:YES];
}

- (IBAction)previous:(id)sender{
    currentViewIndex--;
    [self animatePushView:NO];
}

- (void) animatePushView:(BOOL)forward{
    NSView *nextView = [viewCollection objectAtIndex:currentViewIndex];

    for (NSView *subView in [containerView subviews]) {
        [subView removeFromSuperview];
    }

    [containerView addSubview:nextView];
    [nextView setFrame:containerView.bounds];

    [containerView setNeedsDisplay:YES];

}

我认为这很简单。我有一个数组,其中包含要显示的下一个视图。

我发现下一个视图位于ContainerView的左下角。为什么会这样?

此外,你可能已经猜到了,我是一个新手在管理的意见,尽管我一直对Objective-C的相当长一段时间,所以如果有一些最佳实践我失去了我开建议。 谢谢!

编辑:

我忘了添加: 其中一些视图有不同的大小,我希望能够根据视图大小更改窗口大小。

2 个答案:

答案 0 :(得分:1)

[nextView setFrame:containerView.bounds];

您正在将容器视图界限分配给下一个视图框架doc)。
你可能想要的是将当前视图框架分配给下一个视图框架,并可能调整宽度和高度。

保持对当前显示视图的引用,类似这样(_currentView是类型NSView *的ivar):

- (IBAction) next:(id)sender{
    currentViewIndex++;
    [self animatePushView:YES];
}

- (IBAction)previous:(id)sender{
    currentViewIndex--;
    [self animatePushView:NO];
}

- (void) animatePushView:(BOOL)forward{
    NSView *nextView = [viewCollection objectAtIndex:currentViewIndex];
    [nextView setFrame:_currentView.frame];

    [_currentView removeFromSuperview];    // _currentView is retained in the collection
    [containerView addSubview:nextView];
    _currentView = nextView;

    [containerView setNeedsDisplay:YES];
}

答案 1 :(得分:0)

好的,我想通了..最后..

问题是我必须显示的第一个视图已经包含在.xib文件的容器视图中。

我真的不知道为什么,但它可能会导致容器视图的保留计数出现问题,因为它是在第一次单击时释放的。 释放容器视图会将视图重新定位在(0,0)上,可能是因为它的框架为空,并且视图会因为没有正确保留而闪烁。

从.xib文件中删除视图并通过代码添加视图无论如何都能正常工作。