Objective c 具有自定义视图的NSToolbar
嗨,我有个问题,我真的不知道原因是什么。到目前为止,我制作了一个应用程序,它有一个NSToolbar,其中包含自定义视图,这样你就可以在工具栏上的视图之间切换,就像safari的首选项窗口工具栏视图一样。我在youtube上使用了CCodings教程,但我遇到了视图自行移动的问题,例如,我单击视图1,当我单击视图2时,视图1会发生变化,视图会向上移动,因此当我打开视图时,您只能看到一半,我使用的是Xcode 6和OS X 10.10,所以我不知道这是否是一个原因,但如果您能帮助我,我会提前感谢您,以下是MainWindowController.m文件: 此外,应正确设置视图Objective c 具有自定义视图的NSToolbar,objective-c,cocoa,Objective C,Cocoa,嗨,我有个问题,我真的不知道原因是什么。到目前为止,我制作了一个应用程序,它有一个NSToolbar,其中包含自定义视图,这样你就可以在工具栏上的视图之间切换,就像safari的首选项窗口工具栏视图一样。我在youtube上使用了CCodings教程,但我遇到了视图自行移动的问题,例如,我单击视图1,当我单击视图2时,视图1会发生变化,视图会向上移动,因此当我打开视图时,您只能看到一半,我使用的是Xcode 6和OS X 10.10,所以我不知道这是否是一个原因,但如果您能帮助我,我会提前感谢您
-(NSRect)newFrameForNewContentView:(NSView*)view {
NSWindow *window = [self window];
NSRect newFrameRect = [window frameRectForContentRect:[view frame]];
NSRect oldFrameRect = [window frame];
NSSize newSize = newFrameRect.size;
NSSize oldSize = oldFrameRect.size;
NSRect frame = [window frame];
frame.size = newSize;
frame.origin.y -= (newSize.height - oldSize.height);
return frame;
}
-(NSView *)viewForTag:(int)tag {
NSView *view = nil;
switch (tag) {
case 0:
view = smallView;
break;
case 1:
view = mediumView;
break;
case 2: default:
view = largeView;
break;
}
return view;
}
- (BOOL)validateToolbarItem:(NSToolbarItem *)item {
if ([item tag] == currentViewTag) return NO;
else return YES;
}
-(void)awakeFromNib {
[[self window] setContentSize:[smallView frame].size];
[[[self window] contentView] addSubview:smallView];
[[[self window] contentView] setWantsLayer:YES];
}
-(IBAction)switchView:(id)sender {
int tag = [sender tag];
NSView *view = [self viewForTag:tag];
NSView *previousView = [self viewForTag:currentViewTag];
currentViewTag = tag;
NSRect newFrame = [self newFrameForNewContentView:view];
[NSAnimationContext beginGrouping];
if ([[NSApp currentEvent] modifierFlags] & NSShiftKeyMask)
[[NSAnimationContext currentContext] setDuration:1.0];
[[[[self window] contentView] animator] replaceSubview:previousView with:view];
[[[self window] animator] setFrame:newFrame display:YES];
[NSAnimationContext endGrouping];
}
似乎除了contenView之外,您还需要更改NSWidnow框架。
另外,对于我来说,通过单击事件切换视图,最好使用NSTabView。我猜您已将窗口的内容视图设置为自动调整其子视图的大小。在动画过程中,由于窗口的大小调整,子视图会重新定位甚至调整大小。子视图正在被交换,所以我不清楚自动调整大小会影响到哪一个,但其中一个几乎可以肯定,如果不是两者都会影响的话。然后调回时,不会重新设置帧,因此子视图会被放回窗口中,但位置不同。感谢您的帮助,但我尝试在所有自定义视图上禁用每个自动调整子视图大小,但没有帮助,因此我开始认为可能是故障的Xcode 6或我的操作系统。谢谢您解决了我的问题: