2014-09-29 4 views
0

Привет, у меня есть проблема, и я не могу понять, в чем причина. Я сделал приложение до сих пор, у которого есть NSToolbar, в котором есть пользовательские представления, чтобы вы могли переключаться между представлениями на панели инструментов (так же, как и на панели инструментов Safari). Я использовал учебник CCodings на youtube, но у меня проблема с представлениями, перемещающимися сами по себе, например, я нажимаю на просмотр 1, и когда я нажимаю на вид 2, просматривайте одно изменение, и представление перемещается вверх, так что вы можете видеть только половину времени Я использую Xcode 6 и OS X 10.10, поэтому я не знаю, будет ли это одной из причин, но я заранее вас благодарю, если вы можете мне помочь, heres файл 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

Я предполагаю, что у вас есть просмотр содержимого окна, чтобы выполнить авторазрешение своих подзонов. Во время анимации subviews получают изменение или изменение размера из-за изменения размера окна. Подразделы меняются местами, поэтому мне непонятно, на что повлияет авторезистентность, но одно или другое почти наверняка есть, если не оба. Когда вы затем обмениваетесь назад, вы не переустанавливаете фрейм, поэтому subview возвращается в окно, но в другом положении. –

+0

спасибо за помощь, но я попытался отключить все подпрограммы autoresize во всех пользовательских представлениях, и это не помогло, поэтому я начинаю думать, что это может быть глючный Xcode 6 или моя ОС, спасибо, хотя – Wafflepi

+0

Спасибо, что вы решили мою проблему:) – Wafflepi

ответ

0

Кажется, что вы также должны изменить NSWidnow рамки отдельно от contenView. Также, как и для переключения просмотров по событиям щелчка, лучше использовать NSTabView.

Смежные вопросы