2013-04-22 37 views
8

animasyon bu şekilde oluşturulan saydam başka NSWindow soru ... bende kenarlıksız pencere, ne zaman gölge titreyen ...NSWindow - kenarlıksız, şeffaf pencere - Pencere burada yüksekliğini

- (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; 
} 

.. . ve viewFrameDidChange: bu doğru NSWindow gölge sahip tek yoludur ...

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

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

... olarak tanımlanmaktadır. pencere boyutu değişir, ben display, setHasShadow:NO ve aksi pencere gölge sakat setHasShadow:YES aramak zorunda olduğunda Başka bir deyişle, - bu bütün pencerenin yanında olmadığına - Pencerenin sadece bir parçası, vb

Bu işin ben başlıyor kadar animasyonlu yükseklik. Yükseklik hareketliyse, gölge doğru şekilde yeniden hesaplanır ve görüntülenir, ancak tüm pencere & gölgesi titriyor ve oldukça çirkin.

Gölge fikri neden titriyor? display, setHasShadow:NO/YES'u [self invalidateShadow] ile değiştirmeyi denedim, ancak hiç çalışmıyor ve gölge yanlış bir şekilde görüntüleniyor.

Titremeyi önlemek için pencere kenarlığını gölgesiz kenarlıksız/saydam pencerede nasıl animasyonlu hale getirmelisiniz?

Titreşen gölgenin videosu. http://d.pr/v/lbkQ

+1

Çevremde arama yaptım ve bu yanıtlanması çok zor bir soru gibi görünüyor. Apple ile bir Geliştirici Teknik Desteği yapmanızı öneririm (bir geliştirici olarak yılda 2 ücretsiz alırsınız). Eminim buradaki biri sizin için bu sorunu çözebilir. – sangony

+1

Sorunu kontrollü bir ortamda çoğaltmaya çalıştım ancak başarısız oldu. Aynı tip şeffaf pencereyle (şeffaf kağıt klipsle) titrek olmayan gölgelerim olur. Yeniden boyutlandırma bildirimlerini bile devre dışı bıraktım. [İşte kod] (https://dl.dropboxusercontent.com/u/20258059/WindowShadows.zip). Belki de gölgenin kendisiyle hiçbir ilgisi yoktur, ancak iç görünüşün yeniden çizilmesiyle, sonuçta gölgeyi etkiler. Pencereye tıklayarak pencerenin yeniden boyutlandırılmasının yapıldığından bahsetmeliyim. – aLevelOfIndirection

cevap

2

Gölge hesaplaması ve çizimi çok kaynak tüketen bir işlemdir. Bu yüzden, çerçevenin her değiştiğinde gölgeyi geçersiz kılmanızı ve yeniden hesaplamanızı önermem. Ayrıca, NSWindowDelegate'un bir –windowDidResize: yöntemi vardır, bu yüzden neden gözlemci kullanıyorsunuz?

  1. Pencerenizi nasıl yeniden boyutlandırırsınız? Belki de pencerenin stil maskesine NSResizableWindowMask ekleyerek hile yapacak? Denemelisin. Başka bir öneri - pencerenizin içeriğinin pencereyle birlikte doğru şekilde yeniden boyutlandığını kontrol edin. Pencereni şeffaf olacak şekilde ayarla. Ancak, pencerenin içinde herhangi bir içerik yoksa, gölge görüntülenmez. Görünümünüzü, var olan pencerenin içeriğini değiştirmek yerine alt görünüm olarak da ekleyebilirsiniz.

Projemde hemen hemen aynı kurulum ve pencereyi yeniden boyutlandırmak zaman o pencerenin gölgesi doğru görüntülenir söyleyebilir.

P.S. Bir öneri: nesnenin başlatma yönteminde 'kendi kendine' güvenmeyin. Henüz kullanıma hazır olmayabilir. En azında init, kumandanızda daha büyük olduktan sonra pencereyi ayarlayın (örneğin, setFrame: ekranının, doğru boyutta beklediğiniz şeyi yapacağından emin olamazsınız). Sahip olduğunuz aksaklık da buna bağlı olabilir.

+0

Aklıma başka bir fikir geldi ... Bu gölge geçersiz kılma olmadan, pencere gölgesinin sakat kaldığını söylemiştin - tüm pencerenin etrafında değil. Belki pencerenin bu alanında yarı saydam bir içeriğiniz var mı? – UJey

+1

muhtemelen bir zamanlama sorunuydu, çünkü ben [pencere ekranı]; [window invalidateShadow]; '-windowDidResize:' içinde kusursuz çalışır. Ama ben 'contentView' çerçevesinin değişimini dinlerken ve orada bu iki yöntemi çağırırken cehennem gibi titriyordu. – robertvojta

+0

UJey - başka bir deyişle, sorun çözüldü. – robertvojta

2

Belki de animasyonun başlangıcında gölgeyi kapatmak ve işiniz bittiğinde tekrar açmak daha iyidir. Animasyon sırasında bu ayarı değiştirmeyin. Bunu diğer pencerelerle de görmüştüm.

+0

Teşekkürler, ama bu kullanmak istediğim son yol. Fantastical'e bakın, herhangi bir sorun olmadan yeniden boyutlandırıyorlar. Ya da özel bir gölgesi var ... – robertvojta