1

直到MACOS 10.12下面的代碼工作正常在後臺線程:MACOS 10.13海伊謝拉:獲取到NSGraphicsContext flushGraphics]在後臺線程沒有影響

[nsView lockFocusFocus]; 
... draw something ... 
[[NSGraphicsContext currentContext] flushGraphics]; 
[nsView unlockFocus]; 

憑藉10.13然而,flushGraphics不更新視圖的內容立即了。

我知道現在不鼓勵從後臺線程繪圖,但這並不意味着它不再可能。事實上,所有東西都在...中畫出一些東西...仍然會到視圖的後臺商店。一旦drawRect:在主UI線程中被下一次調用,視圖就會刷新,所有內容都已正確放置。

這怎麼能立即發生?有沒有辦法對立即可見的視圖進行更改?

回答

0

事實證明,對於macOS 10.13,如果drawRect:實際上沒有在該方法的範圍內繪製任何內容,即使其後備存儲已被修改,該視圖的顯示也不會刷新。

所以,如果你想刷新到屏幕上掛起的更改,關鍵是要作出了AppKit 認爲東西繪製,至少畫一個小的看不見的矩形:

- (void) drawRect: (NSRect)rect 
{ 
    if (drawRectWasRequestedByRefresh) { 
     // flush pending changes drawn on background thread 
     [[NSColor clearColor] set]; 
     [NSBezierPath strokeRect: NSMakeRect(0,0,1,1)]; 
     drawRectWasRequestedByRefresh = NO; 
    } else { 
     // draw your view's regular contents here 
    } 
} 

要從觸發刷新後臺線程,使用這個技巧:

- (void) refresh 
{ 
    drawRectWasRequestedByRefresh = YES; 
    [self setNeedsDisplay: YES]; 
} 

這肯定是隻需要爲那些需要從後臺線程(無論何種原因)立即繪圖應用一個骯髒的黑客。如果有人知道更好的解決方案,我會很樂意聽到!

相關問題