2010-11-29 19 views
5

iTunes 'stilini takip eden bir pencere oluşturmak için Cocoa için açık kaynaklı bir kütüphane var mı?iTunes stili NSWindow alt sınıfı?

sample iTunes window

Ben uzay kazandıran ve pencere başlığını gerekmez yarar tipi uygulamalar için iyi bulmak: Bu kontroller yatay dikey yerine yerleştirilir penceredir.

+11

Ben bulmak rahatsız edici ve Apple Tasarım Rehberinde karşı. Gerçekten yapmaya devam etmelerini dilerdim. Kötü bir örnek teşkil ediyor. – JeremyP

cevap

8

Bu çabucak kesmek NSWindow temsilci başlangıç ​​almalısınız:

//VerticalTrafficLightsWindowDelegate.h 

#import <Cocoa/Cocoa.h> 

@interface VerticalTrafficLightsWindowDelegate : NSObject <NSWindowDelegate> { 
    NSWindow *window; 
} 

@property (assign) IBOutlet NSWindow *window; 

- (void)verticalizeButtonsForWindow:(NSWindow *)aWindow; 

@end 

//VerticalTrafficLightsWindowDelegate.m 

#import "VerticalTrafficLightsWindowDelegate.h" 

@implementation VerticalTrafficLightsWindowDelegate 

@synthesize window; 

- (void)awakeFromNib { 
    [self verticalizeButtonsForWindow:window]; 
} 

- (void)windowDidResize:(NSNotification *)notification { 
    [self verticalizeButtonsForWindow:window]; 
} 

- (void)verticalizeButtonsForWindow:(NSWindow *)aWindow { 
    NSArray *contentSuperViews = [[[aWindow contentView] superview] subviews]; 

    NSView *closeButton = [contentSuperViews objectAtIndex:0]; 
    NSRect closeButtonFrame = [closeButton frame]; 

    NSView *minimizeButton = [contentSuperViews objectAtIndex:2]; 
    NSRect minimizeButtonFrame = [minimizeButton frame]; 

    NSView *zoomButton = [contentSuperViews objectAtIndex:1]; 
    NSRect zoomButtonFrame = [zoomButton frame]; 

    [minimizeButton setFrame:NSMakeRect(closeButtonFrame.origin.x, closeButtonFrame.origin.y - 20.0, minimizeButtonFrame.size.width, minimizeButtonFrame.size.height)]; 
    [zoomButton setFrame:NSMakeRect(closeButtonFrame.origin.x, closeButtonFrame.origin.y - 40.0, zoomButtonFrame.size.width, zoomButtonFrame.size.height)]; 
} 

@end 

Ancak ben sadece JeremyP gibi yalnızca Apple bu herhangi OS X'te daha geniş

+0

gerçekten, sadece aynı şeyi umuyorum. Bu kontroller çirkin. –

+0

Bu işe yarıyor, ancak oldukça çirkin. Ayrıca, başlık çubuğunun boyutunu genişletmek zorunda kalırsınız, ancak iTunes'un sadece bir NSToolbar'ın işini yapmak için Kakao eşdeğerini kullandığını sanıyorum. Ama sonra da küçük boyutlu trafik ışıklarına ihtiyacımız var;) –

+0

iTunes'u görsel olarak eşleştirmek için, birleşik bir dokulu pencere kullanmak zorundasınız. Daha da ötesi, eğer iTunes'un pencere UI'sinin (UI Tarayıcısı) nasıl kurulduğuna bakarsanız, iTunes'un hiç bir araç çubuğu kullanmadığını göreceksiniz! Ve bu trafik düğmeleri zaten bir araç çubuğunun elemanları olmamalı, imho. Bunlar bir pencerenin superordinate işlevleridir ve içeriğiyle (araç çubuğu simgeleriyle) ilgili değildir. (Tamam, yakınlaştırma içerikle ilgili bir şeydir, ama konuya dikkat edin, değil mi?)) – Regexident

1

Muhtemelen NSWindow, NSView alt sınıflarını çizmeniz ve kendiniz çizdiğiniz pencereleri ve düğmeleri yapmanız gerekecektir.

Özel çizim yapmak için oldukça önemli ayrıntıları kaybettiğinizi ekledim. Çizim ana iş parçacığı içinde yapıldığı ve ana iş parçacığınız meşgul olabileceği için önemli bir iş yapmak için ana iş parçacığı bir süreliğine engelleme yapıyor olabilir, kullanıcı pencereyi taşıyamaz ve fare düğmesinin üzerinde animasyon çalışamaz .

Tabii ki, başka bir iş parçacığında fare dinleme olayları uygulamıyorsanız, orada çizim yapın, odağı kilitleyin ... Ne demek istedim - gerçekten bunun uygulamanızı daha iyi hale getireceğini düşünmediğiniz sürece rahatsız etmeyin :)

0

Hemen yayılmaya gitmiyor umut söylemek lazım @Regexident 'temelli bir değiştirilmiş sürüm Yeni macOS için s. Yeni macOS kullanıcı arayüzü için görünüm hiyerarşisi değişti, bu yüzden orijinal sürüm çalışmıyor. Modifiye kod aşağıdaki gibi (MacOS 10.13 çalışır) geçerli:

- (void)verticalizeButtonsForWindow:(NSWindow *)aWindow { 
    // New view hierarchy. 
    NSView *titleBarContainerView = aWindow.contentView.superview.subviews[1]; 
    titleBarContainerView.frame = NSMakeRect(titleBarContainerView.frame.origin.x, titleBarContainerView.frame.origin.y - 60.0 + titleBarContainerView.frame.size.height, titleBarContainerView.frame.size.width, 60.0); 
    NSView *titleBarView = titleBarContainerView.subviews[0]; 
    titleBarView.frame = NSMakeRect(0.0, 0.0, titleBarView.frame.size.width, 60.0); 
    NSArray *titleBarSubviews = titleBarView.subviews; 

    NSView *closeButton = [titleBarSubviews objectAtIndex:0]; 
    NSRect closeButtonFrame = [closeButton frame]; 

    NSView *minimizeButton = [titleBarSubviews objectAtIndex:2]; 
    NSRect minimizeButtonFrame = [minimizeButton frame]; 

    NSView *zoomButton = [titleBarSubviews objectAtIndex:1]; 
    NSRect zoomButtonFrame = [zoomButton frame]; 

    // Coordinate changed: add instead of minus. 
    [minimizeButton setFrame:NSMakeRect(closeButtonFrame.origin.x, closeButtonFrame.origin.y + 20.0, minimizeButtonFrame.size.width, minimizeButtonFrame.size.height)]; 
    [zoomButton setFrame:NSMakeRect(closeButtonFrame.origin.x, closeButtonFrame.origin.y + 40.0, zoomButtonFrame.size.width, zoomButtonFrame.size.height)]; 
} 

Sonucu ekran görüntüsü: enter image description here

İlgili konular