2013-04-22 14 views
8

एनिमेट यहाँ एक और NSWindow सवाल ... मुझे मिल गया है सीमारहित खिड़की, पारदर्शी है, जो इस तरह से बनाई गई है है ...NSWindow - सीमाहीन, पारदर्शी खिड़की - छाया झिलमिलाते जब खिड़की ऊंचाई

- (id)initWithView:(NSView *)view anchorPoint:(NSPoint)anchorPoint position:(NSPoint)position distance:(CGFloat)distance { 
    if (!view) { 
    return nil; 
    } 

    NSSize size = view.intrinsicContentSize; 
    NSRect contentRect = NSMakeRect(0, 0, size.width, size.height); 

    self = [super initWithContentRect:contentRect 
          styleMask:NSBorderlessWindowMask 
          backing:NSBackingStoreBuffered 
           defer:NO]; 

    if (!self) { 
    return nil; 
    } 

    _windowView = view; 
    _anchorPoint = anchorPoint; 
    _position = position; 
    _distance = distance; 

    [self setContentView:_windowView]; 

    [self setExcludedFromWindowsMenu:YES]; 
    [self setMovableByWindowBackground:NO]; 

    [self setOpaque:NO]; 
    [self setBackgroundColor:[NSColor clearColor]]; 

    [self setHasShadow:YES]; 
    [self useOptimizedDrawing:YES]; 

    [self setReleasedWhenClosed:NO]; 

    [self setFrame:[self windowRectWithSize:contentRect.size] display:YES]; 

    [self setAnchorAttribute:NSLayoutAttributeTop forOrientation:NSLayoutConstraintOrientationVertical]; 
    [self setAnchorAttribute:NSLayoutAttributeCenterX forOrientation:NSLayoutConstraintOrientationHorizontal]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(viewFrameDidChange:) 
               name:NSViewFrameDidChangeNotification 
              object:nil]; 

    return self; 
} 

.. । और viewFrameDidChange: इस उचित NSWindow छाया के लिए एक ही रास्ता है के रूप में परिभाषित किया गया है ...

- (void)viewFrameDidChange:(NSNotification *)note { 
    if (note.object != self.contentView) { 
    return; 
    } 

    [self display]; 
    [self setHasShadow:NO]; 
    [self setHasShadow:YES]; 
} 

...। दूसरे शब्दों में, विंडो का आकार बदलता है, मैं display, setHasShadow:NO और setHasShadow:YES अन्यथा खिड़की छाया अपंग है कॉल करने के लिए जब भी में - खिड़की का कोई हिस्सा, आदि

यह काम जब तक मैं शुरू करता है - यह पूरे खिड़की के आसपास नहीं है एनिमेटिंग ऊंचाई। यदि ऊंचाई एनिमेटेड है, छाया सही ढंग से पुन: गणना और प्रदर्शित होती है, लेकिन पूरी विंडो & छाया झटकेदार है और यह बहुत बदसूरत है।

एक विचार क्यों छाया छायांकन कर रही है? मैंने display, setHasShadow:NO/YES को [self invalidateShadow] के साथ बदलने की कोशिश की, लेकिन यह बिल्कुल काम नहीं करता है और छाया गलत तरीके से प्रदर्शित होती है।

फ्लिकरिंग से बचने के लिए सीमाहीन/पारदर्शी विंडो में छाया के साथ विंडो ऊंचाई को एनिमेट करना चाहिए?

यहां झटकेदार छाया का वीडियो है। http://d.pr/v/lbkQ

+1

मैंने चारों ओर खोज की और यह जवाब देने के लिए एक बहुत मुश्किल सवाल प्रतीत होता है। मैं सुझाव दूंगा कि आप ऐप्पल के साथ एक डेवलपर तकनीकी सहायता करें (एक डेवलपर के रूप में आपको प्रति वर्ष 2 मुफ्त मिलते हैं)। मुझे यकीन है कि वहां पर कोई भी आपके लिए इस मुद्दे को हल कर सकता है। – sangony

+1

मैंने किसी नियंत्रित वातावरण में समस्या को पुन: उत्पन्न करने की कोशिश की लेकिन असफल रहा। उसी प्रकार की पारदर्शी खिड़की (पारदर्शी पेपर क्लिप के साथ) मुझे अच्छी गैर-झटकेदार छाया मिलती है। मैंने आकार बदलने की सूचनाओं को भी निष्क्रिय कर दिया है। [यहां कोड है] (https://dl.dropboxusercontent.com/u/20258059/WindowShadows.zip)। शायद उसके पास छाया के साथ कुछ भी नहीं है, लेकिन आंतरिक दृश्य को फिर से निकालने के साथ, अंत में अंत में छाया को प्रभावित करता है। मुझे जिक्र करना चाहिए कि खिड़की पर क्लिक करके खिड़की का आकार बदलना है। – aLevelOfIndirection

उत्तर

2

छाया गणना और ड्राइंग एक बहुत ही संसाधन लेने वाला ऑपरेशन है। तो मैं आपको फ्रेम बदलने के हर बार छाया को अमान्य और पुन: गणना करने की अनुशंसा नहीं करता। इसके अलावा, NSWindowDelegate में –windowDidResize: विधि है, तो पर्यवेक्षक का उपयोग क्यों करें?

  1. आप अपनी विंडो का आकार कैसे बदलते हैं? शायद खिड़की के स्टाइल मास्क में NSResizableWindowMask जोड़ना चाल करेगा? आपको इसके लिए प्रयास करना चाहिए।

  2. एक और सुझाव - जांचें कि आपकी खिड़की की सामग्री खिड़की के साथ सही ढंग से बदलती है। आप अपनी खिड़की को पारदर्शी पर सेट करते हैं। लेकिन अगर खिड़की के अंदर कोई सामग्री नहीं है, तो कोई छाया प्रदर्शित नहीं होती है। आप मौजूदा दृश्य की सामग्री के सबव्यूव के रूप में अपना दृश्य जोड़ने का भी प्रयास कर सकते हैं इसे बदलने के बजाए देखें।

मैं अपने प्रोजेक्ट में लगभग एक ही सेटअप है और मैं बता दूँ कि खिड़की की छाया सही ढंग से प्रदर्शित किया जाता है सकते हैं जब आप विंडो का आकार बदलने।

पीएस एक सिफारिश: वस्तु की प्रारंभिक विधि में 'स्वयं' पर भरोसा न करें। यह अभी तक उपयोग के लिए पूरी तरह से तैयार नहीं हो सकता है। कम से कम इनिट, विंडो को अपने कंट्रोलर में निर्माता के बाद समायोजित करें (उदाहरण के लिए, आप यह सुनिश्चित नहीं कर सकते कि सेटफ्रेम: डिस्प्ले वह करेगा जो आप सही आकार के साथ करेंगे)। आपके पास जो गड़बड़ है उससे भी संबंधित हो सकता है।

+0

एक और विचार मेरे दिमाग में आया ... आपने कहा कि इस छाया के अमान्यता के बिना, खिड़की छाया अपंग है - यह पूरी खिड़की के आसपास नहीं है। हो सकता है कि आपके पास विंडो के इस क्षेत्र में एक सेमिट्रेंटेंट सामग्री हो? – UJey

+1

शायद यह कुछ समय मुद्दा था, क्योंकि जब मैं '[विंडो डिस्प्ले] कहता हूं; [विंडो अमान्य छाया]; 'में '-विंडोडिड रीसाइज:', यह काम निर्दोष काम करता है। लेकिन जब मैं 'कंटेंट व्यू' फ्रेम के लिए सुन रहा था और वहां इन दो तरीकों को बुला रहा था, तो यह नरक की तरह झटकेदार था। – robertvojta

+0

उजे - दूसरे शब्दों में, समस्या हल हो गई है। – robertvojta

2

शायद एनीमेशन की शुरुआत में छाया बंद करना और जब आप पूरा कर लें तो वापस स्विच करना बेहतर होगा। एनीमेशन के दौरान इस सेटिंग को स्विच न करें। मैंने सोचा कि मैंने इसे अन्य खिड़कियों के साथ भी देखा है।

+0

धन्यवाद, लेकिन यह आखिरी तरीका है जिसका मैं उपयोग करना चाहता हूं। Fantastical देखो, वे बिना किसी समस्या के इसे आकार बदल रहे हैं। या उनके पास कस्टम छाया है ... – robertvojta

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