2014-09-29 102 views
0

嗨,所以我有一个问题,我不能真正弄清楚原因是什么。我制作了一个应用程序,它有一个NSToolbar,它具有自定义视图,以便您可以在工具栏上切换视图(就像safari的首选项窗口工具栏视图一样)。我在YouTube上使用CCodings教程,但我有自己移动的意见的问题,例如我点击视图1,当我点击视图2查看一个更改和视图向上移动,以便您只能看到一半的时候我放在视图上,我使用的是Xcode 6和OS X 10.10,所以我不知道这是否会是一个原因,但是如果您可以帮助我,请继续阅读MainWindowController.m文件:NSToolbar自定义视图

同样的观点应该是正确设置

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


} 
+0

我的猜测是,您已将窗口的内容视图设置为自动调整其子视图。在动画过程中,由于窗口大小调整,子视图会重新定位或调整大小。子视图正在交换,所以我不清楚哪些会受到自动调整的影响,但其中一个或另一个几乎肯定是(如果不是两者)。当你换回时,你不会重新设定框架,所以子视图会放回到窗口中,但在不同的位置。 – 2014-09-29 02:58:52

+0

感谢您的帮助,但我试图禁用所有自定义视图的每个autoresize子视图,并没有帮助,所以我开始认为它可能是一个毛病Xcode 6或我的操作系统谢谢 – Wafflepi 2014-09-29 04:49:13

+0

谢谢你解决了我的问题: ) – Wafflepi 2014-09-30 02:43:59

回答

0

看来你还需要从contenView除了改变NSWidnow框架。 同样对于我通过点击事件切换视图,最好使用NSTabView。