2011-06-08 14 views
12

Pencereyi yeni görünümün boyutuna yeniden boyutlandırmak için aşağıdaki kodu kullanıyorum setCurrentView yöntemiyle bir NSWindowController sahibiyim.NSWindow'un yeni NSViews ile sığacak şekilde yeniden boyutlandırılması, görünümlerin yanlış çizilmesine neden oluyor

[self resizeWindowForContentSize: [newView frame].size]; 

NSView *contentView = [[self window] contentView]; 
NSDictionary *ani = [NSDictionary dictionaryWithObject:transition 
               forKey:@"subviews"]; 
[contentView setAnimations:ani];  
[[contentView animator] replaceSubview:currentView with:newView]; 

Düzenleme: CocoaDev bulunan resizeWindowForContentSize eklendi.

- (void)resizeWindowForContentSize:(NSSize) size { 
    NSRect windowFrame = [NSWindow contentRectForFrameRect:[[self window] frame] 
     styleMask:[[self window] styleMask]]; 
    NSRect newWindowFrame = [NSWindow frameRectForContentRect: 
     NSMakeRect(NSMinX(windowFrame), NSMaxY(windowFrame) - size.height, size.width, size.height) 
    styleMask:[[self window] styleMask]]; 
    [[self window] setFrame:newWindowFrame display:YES animate:[[self window] isVisible]]; 
} 

yaşıyorum sorun (NSToolbar kullanarak) görünümler arasında geçiş olarak görüşlerini contentView içinde hareket etmek başlamasıdır. Zamanla, aslında boş bir görüşe sahip olana kadar, daha fazla ve daha uzaklaşırlar.

+0

Eğer '-resizeWindowForContentSize gönderebilir miyim:' yöntem bu senin -resizeWindowForContentSize: yöntemdeki sorun olduğunu varsayarak Örneğin

? – NSGod

+0

Yayını bu yöntemle güncelledim. – doomspork

cevap

18
yerine sınıf yöntemleri kullanmanın

:

+[NSWindow frameRectForContentRect:styleMask:] 
+[NSWindow contentRectForFrameRect:styleMask:] 

örnek yöntemleri kullanın:

-[NSWindow frameRectForContentRect:] 
-[NSWindow contentRectForFrameRect:] 

yerine. Örnek yöntemler, araç çubuklarını dikkate alır ve NSWindow örneğiniz olduğunda kullanılmalıdır - [self window] aracılığıyla.

- (void)resizeWindowForContentSize:(NSSize) size { 
    NSWindow *window = [self window]; 

    NSRect windowFrame = [window contentRectForFrameRect:[window frame]]; 
    NSRect newWindowFrame = [window frameRectForContentRect: 
     NSMakeRect(NSMinX(windowFrame), NSMaxY(windowFrame) - size.height, size.width, size.height)]; 
    [window setFrame:newWindowFrame display:YES animate:[window isVisible]]; 
} 
+0

Bu, ilk görünüm anahtarı için çalışır, ancak ilk girişten sonra her geçiş için aynı sorun oluşur. – doomspork

+0

@Doom Kodunuz, 'newView' çerçevesini - özellikle çerçeve kökenini ayarlamanızı göstermiyor. Pencereyi yeniden boyutlandırdıktan sonra, görünümün kare kökenini ('-setFrameOrigin:') ayarlayın, böylece y koordinatı görünümün çerçevesinin yüksekliğidir. –

+0

Önerinizi takip ettim ve başlangıçta işe yaramadı. Ancak, newView'un kökenini 0,0 olarak ayarladığımda her seferinde mükemmel çalışır! – doomspork

3

Tahminimce, araç çubuğu yüksekliğini ve/veya pencerenin başlık çubuğunun 22 piksel yüksekliğini dikkate almayı unutuyor olabilirsiniz.

ben hatırlıyorum daha uzun süre NSWindow bu kategoriyi kullanıyorum:

@implementation NSWindow (MDAdditions) 

- (CGFloat)toolbarHeight { 
    NSToolbar *toolbar = [self toolbar]; 
    CGFloat toolbarHeight = 0.0; 
    NSRect windowFrame; 

    if (toolbar && [toolbar isVisible]) { 
     windowFrame = [[self class] contentRectForFrameRect:[self frame] 
                styleMask:[self styleMask]]; 
     toolbarHeight = NSHeight(windowFrame) - 
         NSHeight([[self contentView] frame]); 
    } 
    return toolbarHeight; 
} 

- (void)resizeToSize:(NSSize)newSize { 
    CGFloat newHeight = newSize.height + [self toolbarHeight]; 
    CGFloat newWidth = newSize.width; 

    NSRect aFrame = [[self class] contentRectForFrameRect:[self frame] 
               styleMask:[self styleMask]]; 

    aFrame.origin.y += aFrame.size.height; 
    aFrame.origin.y -= newHeight; 
    aFrame.size.height = newHeight; 
    aFrame.size.width = newWidth; 

    aFrame = [[self class] frameRectForContentRect:aFrame 
             styleMask:[self styleMask]]; 
    [self setFrame:aFrame display:YES animate:YES]; 
} 

@end 

Orada neye ihtiyacınız dışarı çıkarmak mümkün olabilir.

İlgili konular