2009-11-07 18 views
5

मैं एक कस्टम है कि कोई एप्लिकेशन लिख रहा हूँ के साथ एक कस्टम NSWindow काम करने के लिए एक रास्ता है पारदर्शी NSWindow निम्नलिखित के साथ एक NSWindow उपवर्ग का उपयोग कर बनाया,:,वहाँ रिक्त स्थान

- (id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)aStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)flag 
{ 
    self = [super initWithContentRect:contentRect styleMask:NSBorderlessWindowMask backing:bufferingType defer:flag]; 

    if (self) 
    { 
    [self setOpaque:NO]; 
    [self setBackgroundColor:[NSColor clearColor]]; 
    } 

    return self; 
} 

- (BOOL)canBecomeKeyWindow 
{ 
    return YES; 
} 

- (BOOL)canBecomeMainWindow 
{ 
    return YES; 
} 

मैं सब कुछ पूरी तरह से काम कर रहा है खींचने और आकार बदलने सहित, खिड़की को छोड़कर रिक्त स्थान के साथ काम नहीं करता है। कुंजीपटल शॉर्टकट के माध्यम से रिक्त स्थान स्विच करते समय या खिड़की के नीचे/ऊपर/बाएं/दाईं ओर खींचकर विंडो को पकड़कर मैं विंडो को किसी अन्य स्थान पर नहीं ले जा सकता। वैसे भी एक कस्टम विंडो स्पेस के संबंध में एक सामान्य खिड़की की तरह व्यवहार करने के लिए वैसे भी है?

+0

मुझे एक ही समस्या का सामना करना पड़ रहा है ... क्या आपको कोई समाधान मिला? शायद एक निजी एपीआई? http://stackoverflow.com/questions/6250864/change-to-other-space-macosx-programmatically – nacho4d

उत्तर

0

क्या आपने ओवरवॉइड को ओवरराइड किया था?
Apple documentation कहते हैं, कि यह परिवर्तन रिक्त स्थान व्यवहार:

एक खिड़की देता है यदि नहीं, मतलब है कि यह केवल, F8 मोड में रिक्त स्थान के बीच घसीटा जा सकता है ...

एक अन्य विधि इससे संबंधित हो सकता है: NSWindow setCollectionBehavior

+0

दुर्भाग्यवश, isMovable का कोई प्रभाव नहीं है, और सेट चयन चयन केवल मुझे ऐप को सभी रिक्त स्थान पर प्रदर्शित करने की अनुमति देता है। मुझे लगता है कि setMovableByWindowBackground का उपयोग करके, सब कुछ रिक्त स्थान के संबंध में काम करता है, लेकिन यह मेरे कस्टम ड्रैगिंग और आकार बदलने वाले कोड में हस्तक्षेप करता है, जो मैं नहीं चाहता। तो setMovableByWindowBackground कुछ ऐसा करना चाहिए जो विंडो को रिक्त स्थान के बीच स्थानांतरित करने में सक्षम बनाता है। –

6

लंबे समय बाद मुझे इस परेशानी की समस्या का समाधान मिला। वास्तव में [window setMovableByWindowBackground:YES]; मेरे अपने आकार बदलने के तरीकों के साथ संघर्ष, खिड़की कांप, यह भयानक लग रहा है!

लेकिन अधिभावी नीचे की तरह माउस घटना तरीकों मेरे मामले :) में समस्या हल

- (void)mouseMoved:(NSEvent *)event 
{ 
    //set movableByWindowBackground to YES **ONLY** when the mouse is on the title bar 
    NSPoint mouseLocation = [event locationInWindow]; 
    if (NSPointInRect(mouseLocation, [titleBar frame])){ 
     [self setMovableByWindowBackground:YES]; 
    }else{ 
     [self setMovableByWindowBackground:NO]; 
    } 

    //This is a good place to set the appropriate cursor too 
} 

- (void)mouseDown:(NSEvent *)event 
{ 
    //Just in case there was no mouse movement before the click AND 
    //is inside the title bar frame then setMovableByWindowBackground:YES 
    NSPoint mouseLocation = [event locationInWindow]; 
    if (NSPointInRect(mouseLocation, [titleBar frame])){ 
     [self setMovableByWindowBackground:YES]; 
    }else if (NSPointInRect(mouseLocation, bottomRightResizingCornerRect)){ 
     [self doBottomRightResize:event]; 
    }//... do all other resizings here. There are 6 more in OSX 10.7! 
} 

- (void)mouseUp:(NSEvent *)event 
{ 
    //movableByBackground must be set to YES **ONLY** 
    //when the mouse is inside the titlebar. 
    //Disable it here :) 
    [self setMovableByWindowBackground:NO]; 
} 

मेरे सभी आकार बदलने के तरीकों mousedown में शुरू:

- (void)doBottomRightResize:(NSEvent *)event { 
    //This is a good place to push the appropriate cursor 

    NSRect r = [self frame]; 
    while ([event type] != NSLeftMouseUp) { 
     event = [self nextEventMatchingMask:(NSLeftMouseDraggedMask | NSLeftMouseUpMask)]; 
     //do a little bit of maths and adjust rect r 
     [self setFrame:r display:YES]; 
    } 

    //This is a good place to pop the cursor :) 

    //Dispatch unused NSLeftMouseUp event object 
    if ([event type] == NSLeftMouseUp) { 
     [self mouseUp:event]; 
    } 
} 

अब मैं अपने कस्टम खिड़की है और अच्छा खेलता है रिक्त स्थान के साथ :)

1

यहां दो चीज़ें।

आपको पृष्ठभूमि द्वारा खींचने की अनुमति देने के लिए विंडो सेट करने की आवश्यकता है, [विंडो setMovableByWindowBackground: YES];

और अपने कस्टम खिड़की क्षेत्रों आप खींचने योग्य होने की उम्मीद कस्टम NSView उपवर्गों हैं, तो आप विधि - (BOOL)mouseDownCanMoveWindow किसी भी NSView उपवर्ग कि खींचकर खिड़की स्थानांतरित करने के लिए सक्षम होने की जरूरत में YES वापस जाने के लिए ओवरराइड चाहिए ।

संबंधित मुद्दे