我创建了一个简单的窗口,其目的就像是“向导”(我知道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的相当长一段时间,所以如果有一些最佳实践我失去了我开建议。 谢谢!
编辑:
我忘了添加: 其中一些视图有不同的大小,我希望能够根据视图大小更改窗口大小。
答案 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文件中删除视图并通过代码添加视图无论如何都能正常工作。